AFNetWorking源码见解

###AFNetWorking源码见解

文件结构:

  1. AFHTTPRequestOperationManager用于生成和管理AFHTTPRequestOperation,

  2. AFHTTPRequestOperation继承于AFURLConnectionOperation,

  3. 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
+ (void)networkRequestThreadEntryPoint:(id)__unused object {
@autoreleasepool {
[[NSThread currentThread] setName:@"AFNetworking"];

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

+ (NSThread *)networkRequestThread {
static NSThread *_networkRequestThread = nil;
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
_networkRequestThread = [[NSThread alloc] initWithTarget:self selector:@selector(networkRequestThreadEntryPoint:) object:nil];
[_networkRequestThread start];
});

return _networkRequestThread;
}

使用runloop生成一个常驻的线程,所有的网络请求都使用这个线程

所有的connection都由这个runloop发起,回调也是它接收

把一个异步任务加入group,防止多线程不执行block
1
2
3
4
5
6
7
8
dispatch_group_enter(group); 
[strongSelf performBlock:^(){
block();
dispatch_group_leave(group);
}];
```

###### 回调代码
  • (void)setCompletionBlock:(void (^)(void))block {
    [self.lock lock];
    if (!block) {
    [super setCompletionBlock:nil];
    
    } else {
    __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
    
    `
使用setShouldExecuteAsBackgroundTaskWithExpirationHandler决定APP进入后台后是否继续发送接收请求