非ui-更新功能,例如读取 get 属性,是否需要 uire 在主线程中执行

non-ui-updating functionalities such as reading a get property, is it require to execute in main thread

我知道所有 UI 更新功能都必须在主线程中执行,但是 Xcode 在 UI 非更新功能

上显示以下警告

真的,是真的吗?这些不需要更新的基本功能 UI (如下所示)需要在主线程中执行

if UIButton.isEnabled {
    // do something
}

是的,这是真的。几乎所有 UIKit 调用都必须在主线程上完成。例如,如果您正在操作 UIView(或子类),则必须在主线程上完成。

事实是,对于像 UIKit 这样的非 thread-safe 框架,后台线程禁止更新的不仅仅是 UI。任何读取或写入 UIKit 对象状态的调用都会导致线程问题,因此被禁止。

考虑一个事实,如果你有一个 Int 实例变量 X 表达式:

x += 1 

...如果从后台线程执行可能会导致问题,因为处理器必须从内存中读取 X 的值、计算新值并将结果写回内存。

另一个线程可能会在这 2 个步骤之间向 x 的内存中写入一个新值,并且该新值可能会丢失。

并发编程很难。如果文档说框架不是 thread-safe,请不要从后台线程调用它。句号。

UIKit 不是 thread-safe,因此如果您尝试在后台线程中访问 UIView 及其子类的属性,您可能最终会读取过时的值,因为它们可能已在主线程中更改。

是的,但是您可以通过以下方式使用它:-

dispatch_async(dispatch_get_main_queue(), ^{

// This is main Thread

    if (self.btnSave.isEnabled)
    {
         // Do Something
    }
});