java阻塞主线程_为什么异步阻止执行阻塞主线程?

当使用 AFNetworking 进行网络请求并在主线程中处理响应时,由于在异步队列中加载数据导致主线程被意外阻塞。通过调整 AFHTTPSessionManager 的 completionQueue,可以避免主线程阻塞。分析了导致阻塞的原因,并提供了解决方案。
摘要由CSDN通过智能技术生成

我有一个使用 AFNetworking 发送请求的应用程序,在完成下载后,它调用块我从JSON创建数据模型 . 在模型初始化期间,使用以下代码加载异步图像

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

NSData *urlData = [NSData dataWithContentsOfURL:downloadURL];

}

...这个方法可以在慢速网络上阻塞当前线程数十秒......

但是因为它阻止了主线程 . 经过一番调查,我发现从位于 AFURLSessionManager.m 内的 URLSession:task:didCompleteWithError: 方法开始,具有以下块层次结构

URLSession:task:didCompleteWithError: //1

|

dispatch_async(url_session_manager_processing_queue(), ^{ //2

//url_session_manager_processing_queue() - this is the default queue

|

dispatch_group_async(url_session_manager_completion_group(), dispatch_get_main_queue(), ^{ //3

|

//Inside of my callback

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //4

|

NSData *urlData = [NSData dataWithContentsOfURL:downloadURL];

如果我设置 AFHTTPSessionManager 的 completionQueue 属性:

_sharedClient.completionQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

然后 dispatch_group_sync ... //3 使用默认队列,而不是主线程和主线程没有被阻止 . 有人解释为什么没有设置 completionQueue 属性我的主线程被阻止? (在主线程中显示 semaphore_wait_trap 的堆栈跟踪)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值