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开发中,需要使用线程、线程池吗?在啥时候用线程?啥时候用线程池?