如何将方法标记为仅从 Obj-C 中的主线程调用?

How to mark methods to be invoked only from the main thread in Obj-C?

我正在试用新的 Xcode 9 Main Thread Checker

这很简洁。我现在想标记/注释我的 Obj-C 方法只能从主线程调用,这样主线程检查器可以在附加到调试器时自动启动。我找不到任何方法来做到这一点。

你不能(查看更新)。但是你可以使用断言手动完成它(就像 PSPDFKit 为 example

assert(Thread.isMainThread, "Method must be called from the MainThread only!")


更新:

没办法。 Tweet from an employee:

unfortunately not; you cannot teach Main Thread Checker about you APIs (CC @kubamracek)

by @zaks_anna (Program analysis @apple)


更新 2:Apple 正在跟踪一个开放式雷达,ID#32659599。希望它能尽快实施™。

Main Thread Checker 的主要问题是它可以在后台线程到达它时捕获仅执行主线程的代码,即在运行时。

真正的解决方案是甚至在执行代码之前就使用静态检查,因为有时很难遍历非平凡应用程序中的所有用例。

此外,代码在错误的线程上执行而无论如何稍后都会崩溃并不是一个信息(断言)。

我希望在 Swift 中看到这样的内容: @mainThreadOnly@isOnMainThread

if #mainThreadOnly && !#isOnMainThread { raise_warning }