4

我在一个单独的线程中同步启动我的 ASIHTTPrequest,如下所示:

//inside this start method I create my ASIHTTPRequest and start it
dispatch_async(dispatch_get_global_queue(0, 0), ^{
    [process start];
});

但是 completionBlock 仍然在主线程上触发。可以将完成块的执行与请求开始的地方保持在同一个线程中吗?

我能想出解决这个问题的唯一方法是定义一个调度队列并在同一个线程中手动执行完成块,从而保持对创建队列的引用。但这并不能直接解决它,因为在将其余代码重定向到创建的调度队列之前,您会在主线程中经过一小段时间。

有人有更好的解决方案吗?

编辑:AFNetworking 完成块也是如此......

4

2 回答 2

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];
于 2012-02-28T10:17:55.783 回答
0

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

于 2012-02-27T13:35:20.613 回答