###AFNetWorking源码见解
文件结构:
AFHTTPRequestOperationManager用于生成和管理AFHTTPRequestOperation,
AFHTTPRequestOperation继承于AFURLConnectionOperation,
AFURLConnectionOperation继承于NSOperation
普通的网络请求:
1 | [[AFHTTPRequestOperationManager manager] GET:urlString parameters:parameters success:successBlock failure:failureBlock]; |
1.单例初始化manager,同时初始化
a.AFHTTPRequestSerializer(请求头里面有关客户端的信息),
b.AFJSONResponseSerializer(返回数据接收和处理格式),
c.AFSecurityPolicy(请求安全,https),
d.AFNetworkReachabilityManager(网络状态,wifi,2g,3g),
e.operationQueue队列;
2.创建request,
3.由request创建操作,加入队列
4.开始操作,利用一个NSURLConnection进行网络请求,delegate回调
5.完成后,操作调用completionBlock回调,在回调中由response和error判断成功失败
start方法
1 | [self performSelector:@selector(operationDidStart) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]]; |
单例生成的Thread,runloop里面只有一个NSRunLoopCommonModes
生成常驻线程
1 | + (void)networkRequestThreadEntryPoint:(id)__unused object { |
使用runloop生成一个常驻的线程,所有的网络请求都使用这个线程
所有的connection都由这个runloop发起,回调也是它接收
把一个异步任务加入group,防止多线程不执行block
1 | dispatch_group_enter(group); |
- (void)setCompletionBlock:(void (^)(void))block {
[self.lock lock];
if (!block) {
} else {[super setCompletionBlock:nil];
__weak __typeof(self)weakSelf = self; [super setCompletionBlock:^ { __strong __typeof(weakSelf)strongSelf = weakSelf;
#pragma clang diagnostic push
#pragma clang diagnostic ignored “-Wgnu”
dispatch_group_t group = strongSelf.completionGroup ?: url_request_operation_completion_group();
dispatch_queue_t queue = strongSelf.completionQueue ?: dispatch_get_main_queue();
#pragma clang diagnostic pop
dispatch_group_async(group, queue, ^{
block();
});
dispatch_group_notify(group, url_request_operation_completion_queue(), ^{
[strongSelf setCompletionBlock:nil];
});
}];
}
[self.lock unlock];
}1
2
3
4
5
6
1. 成员变量的对外接口都加了NSRecursiveLock递归锁
2. __weak __typeof(self)weakSelf = self;防止循环引用__strong __typeof(weakSelf)strongSelf = weakSelf;强引用防止被释放后出错
3. dispatch_group_t group = strongSelf.completionGroup ?: url_request_operation_completion_group();单例生成,完成时候,在group和main线程里面执行,执行完后回收
######使用batchOfRequest访问多组网络请求
- (NSArray )batchOfRequestOperations:(NSArray )operations
progressBlock:(void (^)(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations))progressBlock completionBlock:(void (^)(NSArray *operations))completionBlock
`