ios - 从后台线程调用 UIKit 时发出警告

标签 ios uikit

iOS 的 UIKit 不是线程安全的,让我们称之为众所周知的事实。我知道规则,我很小心,但我仍然会被咬 - 时不时地,由此产生的崩溃足以从对 UIKit 的违规后台调用中移除,从而使跟踪问题变得不那么愉快。

这个问题看起来很容易解决——让 UIKit 类/方法在从后台线程调用时发出警告,至少作为调试功能。据我所知,iOS 不提供任何此类功能。当然,可以通过在此类调用之前使用某种形式的断言来手动实现相同的效果,但这种解决方案并不是最优雅的,而且还存在与原始问题相同的弱点,即程序员容易健忘。

有没有人有更优雅的解决方案?您在项目中是如何处理这个问题的?

(注意:this question 是相关的,但不是很明确。有人想知道)


更新:安德鲁的回答是我当时正在寻找的解决方案,但请注意,至少从 Xcode 9 开始,它现在由 xcode/ios 提供。例如,添加此代码:

DispatchQueue.global().async {
        print(self.view.frame)
    }

UIView 的 viewDidLoad 方法会在 Xcode 中生成运行时警告内联 UIView.frame 必须仅在主线程中使用 并向控制台打印一条消息:Main Thread Checker: UI API在后台线程上调用:-[UIView frame]

最佳答案

此代码(只需添加到项目并在没有 ARC 的情况下编译此文件)导致在主线程之外访问 UIKit 断言:https://gist.github.com/steipete/5664345

我刚刚用它来解决我刚刚获取的一些代码中的许多 UIKit/主线程问题。

关于ios - 从后台线程调用 UIKit 时发出警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10976424/

相关文章:

ios - 允许子NSManagedObjectContext在其父上下文保存时获取的设置

ios - facebook 解析快速注册

ios - 在 iPhone 应用程序中绘制/动画此场景的最佳方式

ios - UINavigationBar Touch

ios - 我应该始终为我的模型使用 Core Data 吗?

ios - 检查可选数组是否为空

Javascript - 根据设备更改按钮图像

iOS 13 UISearchController 书签

iphone - iPhone 操作系统是 64 位还是 32 位?

ios - 为什么将UIViewController释放在主线程上?