mor*_*ais 5 cocoa-touch uikit grand-central-dispatch ios
在Cocoa Touch上,如果我们从后台线程更新UI元素,就会发生不好的事情.
问题是,它不会一直发生,所以一些温和的背景UI干扰可能会被忽视一段时间,直到它在你的牙齿中踢你的右边.
有没有办法让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!")
Run Code Online (Sandbox Code Playgroud)
我倾向于将代码分组到方法中,方法 A 执行一些处理,然后调用方法 B,方法 B 执行 UI 更新。在方法 BI 的开头粘贴 BLOCK_UI() 宏,如果未在 UI 上运行,该宏将断言。另外,对于长时间运行的任务,我使用另一个宏。我已将这些宏和更多随机内容放在https://github.com/gradha/ELHASO-iOS-snippets中,您可能会发现它们很有用。
不幸的是,这些宏在使用时需要遵守纪律。处理这种情况的一种更具侵入性的方法可能是通过代理包装所有 SDK 接口对象(也许在启动时进行调整?),该代理会断言它们是否不在主线程中使用。这些代理/调配只会在调试版本或模拟器环境中发生,以避免陷入真正的发布困境。我考虑过这样做......但看起来正确地做起来很痛苦。
| 归档时间: |
|
| 查看次数: |
456 次 |
| 最近记录: |