我正在学习斯坦福大学视频中的块。我现在处于解释核心数据的部分。老师们提到了一些事情:
- (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...
}
当我使用块时,如果在调用它们的地方调用它们,我不需要担心回到主线程吗?
希望这很清楚,
提前致谢
答案 0 :(得分:15)
如果某些内容异步运行,您应该阅读文档以了解哪个线程,例如:完成块将被执行。如果是你的代码,你在这里负责,你可以使用全局GCD队列,你可以创建自己的队列并在那里或其他任何地方执行...
通常,块的行为类似于函数或方法调用,它在线程上执行,调用它。甚至可能同时从2个不同的线程执行相同的块。
并且要明确:即使你正在使用积木,你也需要关心回到主线程,当然,如果有必要的话
答案 1 :(得分:4)
没有任何强制在特定线程上调用块,所以它取决于具体的方法,是否需要担心它的回调是在主线程上。 (在实践中,我不记得曾经见过一个库,其中主线程上调用的方法不也在主线程上调用它的完成处理程序。但是你仍然需要阅读文档您正在使用的特定库和方法,一如既往地。)