在哪个线程上调用iOS块?

时间:2013-11-05 12:27:09

标签: ios objective-c

我正在学习斯坦福大学视频中的块。我现在处于解释核心数据的部分。老师们提到了一些事情:

- (void)openWithCompletionHandler:(void (^)(BOOL success))completionHandler;

他说将在调用方法的线程中调用completionhandler块。所以基本上该方法运行异步,但是在线程上调用块,让我们假设main。

所以我的问题是所有块都在进行方法调用的线程上运行。为了说明为什么我问这个问题,我有一个Async类,它向服务器请求。

所有这些方法的格式如下:

- (void) getSomething:(id <delegateWhatever> const)delegate{
   goto background thread using GCD..
   Got result from server...
   Go back to main thread and call the delegate method...
}

当我使用块时,如果在调用它们的地方调用它们,我不需要担心回到主线程吗?

希望这很清楚,

提前致谢

2 个答案:

答案 0 :(得分:15)

如果某些内容异步运行,您应该阅读文档以了解哪个线程,例如:完成块将被执行。如果是你的代码,你在这里负责,你可以使用全局GCD队列,你可以创建自己的队列并在那里或其他任何地方执行...

通常,块的行为类似于函数或方法调用,它在线程上执行,调用它。甚至可能同时从2个不同的线程执行相同的块。

并且要明确:即使你正在使用积木,你也需要关心回到主线程,当然,如果有必要的话

答案 1 :(得分:4)

没有任何强制在特定线程上调用块,所以它取决于具体的方法,是否需要担心它的回调是在主线程上。 (在实践中,我不记得曾经见过一个库,其中主线程上调用的方法也在主线程上调用它的完成处理程序。但是你仍然需要阅读文档您正在使用的特定库和方法,一如既往地