2012-02-27 34 views
4

我开始同步我的ASIHTTPrequest在这样一个单独的线程:能在ASIHTTPRequest/AFNetworking后台线程上执行一个completionBlock吗?

//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完成块真的......

回答

4

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

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

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

UPDATE:例

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

你介意发表一个这样的例子吗?我正在为同样的事情苦苦挣扎,但我没有足够的精通Obj-C来理解如何在没有示例的情况下实现您的解决方案。谢谢! – Julian 2012-04-18 21:53:41

+1

刚刚更新了一个例子的答案,希望这有助于!另外请确保在不再需要时释放requestQueue,因此最好创建一个实例变量并使用dispatch_release(requestQueue)释放它; – Yannick 2012-04-20 06:38:16

+0

似乎AFHTTPRequestOperation不再具有这些属性...认为它现在是“completionQueue” – shim 2015-10-20 22:16:59

0

尝试使用定义了自己创作的队列。然后,您可以(一旦它终于完成,在其完成块中)发回全局队列以更新任何必要的显示。

+0

你是什么意思与全局队列? – Yannick 2012-02-27 13:41:55

+0

对不起 - 实际上我的意思是'dispatch_get_main_queue'。苹果有一个伟大的视频:“第308场 - 块和大中央调度实践”,我指的是30:28左右的模式。如果您是Apple开发人员,则免费。 :) – 2012-02-27 13:52:18

+0

好吧,现在我确定你的意思,我需要告诉你,这不是我在这里寻找的。完成此ASIHTTPRequest后,completionBlock中的代码将自动在“dispatch_get_main_queue”上调用。我试图不这样做;)。我想继续执行在同一线程中调用开始在... – Yannick 2012-02-27 14:12:12

相关问题