【发布时间】:2018-03-13 10:29:31
【问题描述】:
我了解所有 UI 更新功能都必须在主线程中执行,但 Xcode 显示以下关于 UI 非更新功能的警告
真的,是真的吗?这种不需要更新UI的基本功能(如下)需要在主线程中执行
if UIButton.isEnabled {
// do something
}
【问题讨论】:
标签: ios swift xcode multithreading xcode9
我了解所有 UI 更新功能都必须在主线程中执行,但 Xcode 显示以下关于 UI 非更新功能的警告
真的,是真的吗?这种不需要更新UI的基本功能(如下)需要在主线程中执行
if UIButton.isEnabled {
// do something
}
【问题讨论】:
标签: ios swift xcode multithreading xcode9
UIKit 不是线程安全的,因此如果您尝试在后台线程中访问 UIView 及其子类的属性,您最终可能会读取过时的值,因为它们可能已在主线程中更改。
【讨论】:
是的,这是真的。几乎所有 UIKit 调用都必须在主线程上完成。例如,如果您正在操作 UIView(或子类),则必须在主线程上完成。
事实是,对于像 UIKit 这样的非线程安全框架,后台线程不仅仅禁止 UI 更新。任何读取或写入 UIKit 对象状态的调用都会导致线程问题,因此是被禁止的。
考虑一个事实,如果你有一个 Int 实例变量 X 表达式:
x += 1
...如果从后台线程执行可能会导致问题,因为处理器必须从内存中读取 X 的值,计算新值,然后将结果写回内存。
有可能另一个线程可能会在这两个步骤之间将一个新值写入x 的内存,并且该新值可能会丢失。
并发编程很难。如果文档说框架不是线程安全的,请不要从后台线程调用它。句号。
【讨论】:
是的,但是您可以通过以下方式使用它:-
dispatch_async(dispatch_get_main_queue(), ^{
// This is main Thread
if (self.btnSave.isEnabled)
{
// Do Something
}
});
【讨论】: