IBActions是否在主队列上触发?

11

我试图搜索这个问题,但在这个问题上有些困惑。所有关于界面UI的指南都说,所有UI相关的操作都应该在GCD主线程上执行,但没有人提及IBAction的内部实现。

那么,IBAction是在GCD主线程上触发的还是不是呢?


2
是的,它们在主线程上执行。 - Rob
1
是的,你可以使用 NSLog(@"is main thread? %d", [NSThread isMainThread]); 来测试它。你也可以使用调试器和左侧视图来了解哪个线程正在执行你的代码。 - Ricardo
2
@Ricardo 谢谢,我没有想到会这么简单的检查 =( 你能把这个作为答案吗?这样对其他人也有用。 - htzfun
1
完成 @htzfun,在这些情况下,调试器和左侧视图比使用日志更快。 - Ricardo
3
@htzfun,这段话不太直观,经过一秒钟的谷歌搜索:_"正如其名称所示,主运行循环在应用程序的主线程上执行。这种行为确保用户相关事件按照接收顺序串行处理。"_(来源:https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html) - holex
显示剩余2条评论
2个回答

6

可以使用NSLog(@"is main thread? %d", [NSThread isMainThread]);来测试,你也可以使用调试器和左侧窗格来了解哪个线程在执行你的代码。


7
当然您可以测试并且有时会发生,但是文档是否保证它将始终在主队列上发生呢? - Bryan Bryce
1
@BryanBryce,我的回答是针对你的评论的。 - ScottyBlades
文档并不保证IBAction关键字在主线程安全方面的任何内容。在文档中找到的IBAction的唯一目的是连接到界面构建器。简单地说,无论是否为IBAction函数,都将在调用该函数的线程上调用该函数。没有任何保证... - Dominik Bucher

3
可以安全地假设,苹果在底层代码中只会在主线程上调用@IBAction。这是根据苹果的文档得出的结论:

重要提示:除非另有说明,请仅从应用程序的主线程或主分派队列使用UIKit类。此限制特别适用于从UIResponder派生或以任何方式操纵您的应用程序用户界面的类。

注意:您的代码完全可以在后台线程上调用@IBAction方法。这就是我进行这种区分的原因。 注意:如果您因为IBOutlet错误而来到这里,请将您的IBOutlets设置为强引用(不是弱引用),以避免在某些情况下访问空IBOutlets。

绝对不能假设 IBAction 标记的函数在主线程下调用。这个关键字的唯一目的是使函数可以连接到界面构建器。否则,该函数将从调用该函数的线程中调用。因此,如果 Apple 疯了,并且调用 @IBAction 的地方不在主线程上,那么你就不在主线程上 :) - Dominik Bucher
1
嗨@Dominik Bucher,您能否提供一个示例,说明IBAction标记的函数在后台线程下被调用,或者任何原因为什么苹果会“疯狂”地在后台线程上调用IBAction而违反他们自己的“Important”标记指南? - ScottyBlades

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接