可以在后台线程上从ASIHTTPRequest / AFNetworking执行completionBlock吗?

时间:2012-02-27 13:30:09

标签: ios multithreading asihttprequest afnetworking

我在一个单独的线程中同步启动我的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完成块也是如此......

2 个答案:

答案 0 :(得分:4)

好的,回答我自己的问题: ASIHTTPRequest框架没有在不同线程中启动完成块的选项。

相反,可以使用AFNetwork框架。在这里,您可以在任何类型的AFOperation中使用两个属性,称为“ successCallbackQueue ”和“ failureCallbackQueue ”。您可以在哪里添加预定义的“ dispatch_queue_t ”来处理成功和失败块的执行。

希望这会帮助其他人解决同样的问题!

更新:示例

 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];

答案 1 :(得分:0)

尝试使用您自己创建的已定义队列。然后你可以(一旦它最终完成,在它的完成块中)发信号回到全局队列以更新任何必要的显示。