【问题标题】:non-ui-updating functionalities such as reading a get property, is it require to execute in main thread非 ui 更新功能,例如读取 get 属性,是否需要在主线程中执行
【发布时间】:2018-03-13 10:29:31
【问题描述】:

我了解所有 UI 更新功能都必须在主线程中执行,但 Xcode 显示以下关于 UI 非更新功能的警告

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

if UIButton.isEnabled {
    // do something
}

【问题讨论】:

    标签: ios swift xcode multithreading xcode9


    【解决方案1】:

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

    【讨论】:

    • 或者,如果您进行更改 UIView 状态的调用,这些状态更改将被错误应用。 UIView 对象有大量的状态和大量依赖/改变状态的逻辑,所以它们非常不是线程安全的。
    【解决方案2】:

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

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

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

    x += 1 
    

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

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

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

    【讨论】:

      【解决方案3】:

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

      dispatch_async(dispatch_get_main_queue(), ^{
      
      // This is main Thread
      
          if (self.btnSave.isEnabled)
          {
               // Do Something
          }
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多