AFNetworking 同步请求(使用信号量,解决死锁)

       AFNetworking 同步请求?怎么会有这样的设计~有时候确实存在这样的情况和需求,哎硬着头皮解决吧!

       之前写过一篇使用NSURLSession同步获取数据,于是想到的也是使用信号量,代码走起,请求,居然AF请求发出,没有返回~死锁了???

      于是开始着手调研,参考网上提供的思路,以及大神解答,查看大神么的回复发现,确实AF使用信号量会造成死锁,造成死锁的原因是AF默认的回调都是在mainQueue上执行的。而主线程因为dispatch_semaphore_wait的关系锁死了,AF的回调需要等待主线程解锁后才会继续。。而解锁的钥匙却在回调里。知道了原因可以还是不知道怎么解决,知道了思路就多了调查方向,继续调查,终于在stackoverflow上找到了解决办法。将AF的回调队列放到全局队列(dispatch_get_global_queue)中,问题迎刃而解,将自己的成功记录下来,供以后参考。具体实现直接上代码:

- (id)sendForUrl:(NSURL *)url {

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

manager.completionQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);//关键的就是这句

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

__block id response;

[manager GET:url.absoluteString parameters:nil success: ^(AFHTTPRequestOperation *operation, id responseObject) {

response = responseObject;

NSLog(@"JSON: %@", responseObject);

dispatch_semaphore_signal(semaphore);

} failure: ^(AFHTTPRequestOperation *operation, NSError *error) {

NSLog(@"Error: %@", error);

dispatch_semaphore_signal(semaphore);

}];

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

return response;

}

经过测试,非常完美~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

也可使用别人对AF扩展的同步请求AFNetworking-Synchronous  本人没有测试,不能保证

 语言&技术能力有限,如有不恰当的地方欢迎指正批评。

参考链接:

1:Wait for AFNetworking completion block before continuing (i.e. Synchronous)

2:周末有人没 ,请教AFN3.0同步请求的问题

3:Synchronous request

4:AFNetworking的线程和信号量问题

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 有时候我们会碰到这样子的一种情形: 同时获取两个网络请求的数据,但是网络请求是异步的,我们需要获取到两个网络请求的...
    freesan44阅读 3,110评论 2 0
  • 一. 重点: 1.dispatch_queue_create(生成Dispatch Queue) 2.Main D...
    BestJoker阅读 5,466评论 2 2
  • 接着上一篇的内容往下讲,如果没看过上一篇内容可以点这: AFNetworking到底做了什么? 之前我们讲到NSU...
    涂耀辉阅读 21,286评论 28 161
  • 文/山雨 雨中 我看着那一片片精灵 它曾经那样辉煌 站在高高地树顶上 迎风招展 任阳光雨露将它滋养 那生机盎然的模...
    如影泡幻阅读 3,688评论 0 5
  • 那个晨曦我拥抱了你 脚下的路 在露草与花香的簇拥下 延伸到天的尽头…… 知道那天你哭了 黑绵的云也跟着路 我也哭了...
    诗歌刘振扬阅读 1,196评论 0 0