热门搜索 :
考研考公
您的当前位置:首页正文

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

来源:东饰资讯网

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

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

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

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

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;

}

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

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

参考链接:

Top