美文网首页征服iOS
AFNetworking 同步请求(使用信号量,解决死锁)

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

作者: Civiy | 来源:发表于2017-05-12 11:54 被阅读785次

       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的线程和信号量问题

相关文章

网友评论

    本文标题:AFNetworking 同步请求(使用信号量,解决死锁)

    本文链接:https://www.haomeiwen.com/subject/oqyztxtx.html