发送同步网络请求

NSTimeInterval threadBlockInterval = 10.0;

dispatch_group_t group = dispatch_group_create();

for (int i = 0; i < 3; ++i) {
    // enter 和 leave 必须成对出现
    dispatch_group_enter(group);
    
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionTask *task = [session dataTaskWithURL:[NSURL URLWithString:@"http://www.jianshu.com"]
                                    completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                                        
                                        // handle response
                                        
                                        // 注意:
                                        // 当前的线程和调用线程不是一个线程,更不能返回调用线程做操作,会死锁的。
                                        
                                        // 因为,AFNetworking completionBlock 是返回 main thread 调用的,
                                        // 所以,如果调用线程就是 main thread 的话是不能使用 AFNetworking 的
                                        
                                        dispatch_group_leave(group);
                                    }];
    [task resume];
}

dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, threadBlockInterval * NSEC_PER_SEC));

注意:

  1. 如果想在 main thread 发送同步请求,不能使用 AFNetworking
  2. 如果网络做了缓存的话,也就是 completionHandler 可能会调用 >=2 次,在 dispatch_group_leave 那里需要做判断,enterleave 调用次数 必须 保持一致

你可能感兴趣的:(发送同步网络请求)