我像这样在单独的线程中同步启动我的 ASIHTTPrequest:
//inside this start method I create my ASIHTTPRequest and start it
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[process start];
});
但是 completionBlock 仍然在主线程上触发。 是否可以将 completionBlock 的执行保持在与请求开始的线程相同的线程中?
我唯一能想到的解决这个问题的方法是定义一个调度队列并在同一个线程中手动执行 completionBlock,从而持有对已创建队列的引用。但这并不能直接解决问题,因为在将其余代码重定向到创建的调度队列之前,您会在主线程中传递一小段时间。
有人有更好的解决方案吗?
编辑:AFNetworking 完成 block 也是如此......
最佳答案
好吧,回答我自己的问题: ASIHTTPRequest 框架没有在不同线程中启动完成 block 的选项。
相反,您可以使用 AFNetwork 框架。在这里,任何类型的 AFOperation 都有两个属性,称为“successCallbackQueue”和“failureCallbackQueue”。您可以在其中添加预定义的“dispatch_queue_t”来处理成功和失败 block 的执行。
希望这能帮助其他遇到同样问题的人!
更新:示例
dispatch_queue_t requestQueue = dispatch_queue_create("requestQueue", NULL);
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:yourRequest];
operation.successCallbackQueue = requestQueue;
operation.failureCallbackQueue = requestQueue;
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
// add code for completion
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// add code for failure
}];
[operation start];
关于ios - 可以在后台线程上从 ASIHTTPRequest/AFNetworking 执行 completionBlock 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9465834/