iOS 块在啥线程上调用?

Posted

技术标签:

【中文标题】iOS 块在啥线程上调用?【英文标题】:iOS blocks are called on what thread?iOS 块在什么线程上调用? 【发布时间】:2013-11-05 12:27:08 【问题描述】:

我正在从斯坦福的视频中了解积木。我现在在解释核心数据的部分。老师们提到了一些事情:

- (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...

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

希望这很清楚,

提前致谢

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

+1 "n 一般,块的行为类似于函数或方法调用,它在调用它的线程上执行。"【参考方案2】:

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

【讨论】:

好的,谢谢 :) 澄清后 - 我将删除我的 cmets。感谢您改进您的答案! ;)

以上是关于iOS 块在啥线程上调用?的主要内容,如果未能解决你的问题,请参考以下文章

WKWebView的evaluateJavascript方法的completionHandler运行在啥线程上?

j2ee开发中,需要使用线程、线程池吗?在啥时候用线程?啥时候用线程池?

在啥情况下,一个空的同步块可以实现正确的线程语义?

无法从 iOS6 中的后台线程调用主线程上的代码

iOS:主线程检查器:在后台线程上调用的 UI API:-[UIView retainCount]

iOS - 确保在主线程上执行[重复]