如何将方法标记为仅从 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 }
我正在试用新的 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 }