必备知识架构-第三方网络库AFNetworking
[toc]
知识架构
AFNetworking源码解析与面试考点思考
八、多线程–第三方库AFNetworking
1、AFNetworking源码解析
2、AFNetworking的线程和信号量问题
AFNetworking3.0后为什么不再需要常驻线程?
B.一个请求一条线程
如果来一个请求开辟一条线程,设置runloop保活线程,等待结果回调。这种方式理论上是可行的,但是你也看到了,线程开销太大了。(PASS)
C.一条常驻线程
只开辟一条子线程,设置runloop使线程常驻。所有的请求在这个线程上发起、同时也在这个线程上处理回调。
线程保活的代码
1 | + (void)aliveThread { |
我们知道主线程一直是保活的;而新建的子线程默认是没有添加Runloop的,因此给这个线程添加了一个runloop,并且加了一个NSMachPort,来防止这个新建的线程由于没有活动直接退出。
AFNetworking一些API介绍
必知点:AFNetworking框架默认请求类型requestSerializer
和响应类型responseSerializer
都是JSON格式的,即默认请求类型为AFJSONRequestSerializer
,默认相应类型为AFJSONResponseSerializer
。
1、关于请求类型及请求参数的书写
所以在进行请求时候,我们必须根据自己请求的参数类型parameters,对AFNetworking的请求类型进行设置。主要设置为:
- 如果请求参数是字典类型
NSDictionary
,则请求类型应设置AFHTTPRequestSerializer
。 - 如果请求参数是JSON类型,则请求类型应设置
AFJSONRequestSerializer
。
因为设置的类型不同,AFNetworking会根据设置的类型执行该类型下面对应的- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request withParameters:(id)parameters error:(NSError *__autoreleasing *)error
方法。
其中
AFHTTPRequestSerializer对参数会有如下第496行的处理query = AFQueryStringFromParameters(parameters);
该处理为将字典类型转为一串请求的字符串格式。
AFJSONRequestSerializer对参数的处理主要为第1260行的[mutableRequest setHTTPBody:[NSJSONSerialization dataWithJSONObject:parameters options:self.writingOptions error:error]];
2、关于响应类型及响应response
响应的时候,AFURLSessionManager
其会调用AFURLSessionManagerTaskDelegate
协议,执行该协议里第292的responseObject = [manager.responseSerializer responseObjectForResponse:task.response data:data error:&serializationError];
可以看出这里会根据我们设置的不同响应类型,调用该响应类型下的
1 | - (id)responseObjectForResponse:(NSURLResponse *)response |
所以,这里我们衍生出一个继承自AFJSONResponseSerializer的CJJSONResponseSerializer的新响应类型,重写该方法,用来处理服务端返回的JSON不是标准的json格式的问题,即主要处理AFNetworking 3840的错误。
END
< 返回目录