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));
注意:
- 如果想在 main thread 发送同步请求,不能使用
AFNetworking
- 如果网络做了缓存的话,也就是 completionHandler 可能会调用
>=2
次,在dispatch_group_leave
那里需要做判断,enter
和leave
调用次数 必须 保持一致