【问题标题】:Cocoa-Touch – Guidelines on what thread to perform GUI updatesCocoa-Touch – 关于执行 GUI 更新的线程的指南
【发布时间】:2011-12-23 12:21:07
【问题描述】:

我知道作为一般准则,您应该始终在主线程上执行 GUI 更新。但有时它并不那么明显。例如,我应该在哪里进行调用:

setBadgeValue: 还是 UITabBarItem?

或者

[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]

在类引用中没有指定这些方法是否可以在非主线程上运行。

【问题讨论】:

    标签: objective-c multithreading cocoa-touch user-interface grand-central-dispatch


    【解决方案1】:

    一般规则是你应该保持 UIKit 更新到主线程,除非 UIKit 从另一个线程通过你的实现调用。

    参考Important: The UIKit classes are generally not thread safe. All drawing-related operations should be performed on your application’s main thread.

    From iOS 4 release notes:

    • 在 UIKit 中绘制到图形上下文现在是线程安全的。具体来说: 用于访问和操作图形上下文的例程现在可以正确处理驻留在不同线程上的上下文。
    • 字符串和图像绘制现在是线程安全的。
    • 现在可以安全地在多个线程中使用颜色和字体对象。

    有了这些信息,除非我或其他人挖掘出更多文档(我扫描了发行说明并没有看到更多):

    setBadgeValue: 的 UITabBarItem?

    假设只从主线程调用是安全的。

    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]
    

    假设只从主线程调用是安全的。

    【讨论】:

    • 感谢贾斯汀,虽然在发行说明中我看不到有关调用主(或非主)线程的任何信息?只是它是线程安全的?
    • @Peter 是的,苹果没有详细说明它或让它足够大胆 IMO,他们也有一些例外,但他们确实没有正确详细说明什么是可以的,什么是不可以的。所以,你只需要保持安全,假设它不是因为如果你试图对抗系统,线程问题和特定于版本的问题就不好玩了。 OS X 也是如此(在这方面进步缓慢)。一般的假设是,除非明确记录,否则它是不安全的。另外:参考添加到答案。
    • “线程安全”对不同的人有不同的含义,甚至在 Apple 文档中也有不同的含义。根据我的经验,除非文档另有明确说明,否则如果一个类以 UI 开头(即 UIKit 中的所有内容),您应该认为它只是主线程。更多细节在这里:tinyurl.com/co6353b
    【解决方案2】:

    为了确定,不妨在主线程上调用它们。

    【讨论】:

      猜你喜欢
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多