第三方网络库AFNetworking

必备知识架构-第三方网络库AFNetworking

[toc]

知识架构

iOS知识库

Android知识库

AFNetworking源码解析与面试考点思考

AFNetworking源码解析与面试考点思考

八、多线程–第三方库AFNetworking

< 返回目录

1、AFNetworking源码解析

2、AFNetworking的线程和信号量问题

AFNetworking3.0后为什么不再需要常驻线程?

AFNetworking3.0后为什么不再需要常驻线程?

B.一个请求一条线程

如果来一个请求开辟一条线程,设置runloop保活线程,等待结果回调。这种方式理论上是可行的,但是你也看到了,线程开销太大了。(PASS)

C.一条常驻线程

只开辟一条子线程,设置runloop使线程常驻。所有的请求在这个线程上发起、同时也在这个线程上处理回调

线程保活的代码

1
2
3
4
5
6
7
8
9
+ (void)aliveThread {
@autoreleasepool {
[[NSThread currentThread] setName:@"AFNetworking"];

NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
[runLoop run];
}
}

我们知道主线程一直是保活的;而新建的子线程默认是没有添加Runloop的,因此给这个线程添加了一个runloop,并且加了一个NSMachPort,来防止这个新建的线程由于没有活动直接退出。

AFNetworking一些API介绍

必知点:AFNetworking框架默认请求类型requestSerializer和响应类型responseSerializer都是JSON格式的,即默认请求类型为AFJSONRequestSerializer,默认相应类型为AFJSONResponseSerializer

1、关于请求类型及请求参数的书写

所以在进行请求时候,我们必须根据自己请求的参数类型parameters,对AFNetworking的请求类型进行设置。主要设置为:

  1. 如果请求参数是字典类型NSDictionary,则请求类型应设置AFHTTPRequestSerializer
  2. 如果请求参数是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
2
3
- (id)responseObjectForResponse:(NSURLResponse *)response
data:(NSData *)data
error:(NSError *__autoreleasing *)error

所以,这里我们衍生出一个继承自AFJSONResponseSerializer的CJJSONResponseSerializer的新响应类型,重写该方法,用来处理服务端返回的JSON不是标准的json格式的问题,即主要处理AFNetworking 3840的错误。

END

< 返回目录