非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
}
});
我知道所有 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
}
});