ios - 在 Cocoa Touch/UIKit 上,如何从后台线程检测用户界面的变化?

标签 ios cocoa-touch uikit grand-central-dispatch

在 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/

相关文章:

cocoa-touch - 在 iOS 中嵌入 Youtube 视频

ios - 如何以编程方式访问 iOS 系统字体

ios - 如何以编程方式将纵横比约束应用于自定义 UICollectionViewCell?

ios - 如何将 UIControl 作为函数参数传递?

reactjs - index.html 中 node_modules 中的引用文件夹(create-react-app)

ios - 如何在 iOS 中制作个人热点打开时使用的发光条效果?

ios - 如何防止我的节标题与组合布局中的单元格重叠

ios - 如何在 Swift 中使用 AVCaptureSession 捕获图片?

ios - 在不使用UIDocumentInteractionController的情况下从iOS应用程序在Whatsapp上共享图像

ios - NSURLSession 后台下载 - 通过网络故障恢复