发送同步网络请求

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:@"//www.greatytc.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 调用次数 必须 保持一致
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.dispatch_group_async、dispatch_group_t与dispatch_group_no...
    Zavier_copy阅读 445评论 0 0
  • 场景 在开发过程中,有时候会遇到这样一些问题,比如: 在某些业务要求下,需发送同步请求。 在某些界面需请求多个接口...
    tingxins阅读 10,507评论 3 48
  • 内存管理 1.什么情况使用weak关键字,相比assign有什么不同? 什么情况使用 weak 关键字?在 ARC...
    刺骨寒阅读 692评论 0 1
  • 这里所说的同步执行是指多个网络请求按顺序执行,但这些请求还是可以在异步线程处理的不会阻塞主线程;首先我们看一个实际...
    _小沫阅读 2,902评论 0 4
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,556评论 16 22