在 Cocoa Touch 上,如果我们从后台线程更新 UI 元素,就会发生不好的事情。
问题是,它不会一直发生,所以一些轻微的后台 UI 干预可能会在一段时间内被忽视,直到它踢到你的 dentry 。
有没有办法让 UIKit 在迂腐模式下运行,以便一旦有人从后台线程更新元素,它就会崩溃或将某些内容记录到控制台?
最佳答案
在进行 UI 更新之前,您可以检查自己是否在主线程上执行操作。我自己编写了以下宏:
/// Stick this in code you want to assert if run on the main UI thread.
#define DONT_BLOCK_UI() \
NSAssert(![NSThread isMainThread], @"Don't block the UI thread please!")
/// Stick this in code you want to assert if run on a background thread.
#define BLOCK_UI() \
NSAssert([NSThread isMainThread], @"You aren't running in the UI thread!")
我倾向于将我的代码分组到方法中,其中方法 A 执行一些处理,然后调用方法 B,后者执行 UI 更新。在方法 B 的开头,我粘贴了 BLOCK_UI() 宏,如果它没有在 UI 上运行,它将断言。此外,对于长时间运行的任务,我使用另一个宏。我把这些宏和更多随机的东西放在 https://github.com/gradha/ELHASO-iOS-snippets您可能会觉得有用。
不幸的是,这些宏在使用时需要遵守纪律。处理这种情况的一种更具侵入性的方法可能是通过代理包装所有 SDK 接口(interface)对象(可能在启动时调配?)如果它们不在主线程中使用则断言。这些代理/调配只会发生在调试版本或模拟器环境中,以避免拖慢真正的发布。我考虑过这样做......但看起来很难正确地做到这一点。
关于ios - 在 Cocoa Touch/UIKit 上,如何从后台线程检测用户界面的变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7729971/