【问题标题】:Is it safe to set NetworkActivityIndicatorVisible value in secondary thread?在辅助线程中设置 NetworkActivityIndi​​catorVisible 值是否安全?
【发布时间】:2026-01-02 09:25:02
【问题描述】:

我想知道 AppDelegate 是否是线程安全的?我目前有一个在辅助线程上运行网络任务的操作,当任务开始时,我想将NetworkActivityIndicatorVisible设置为YES,当任务完成时,将其设置为NO。我是否必须始终在主线程中调用它,或者我可以在当前运行循环线程中调用它?

谢谢

【问题讨论】:

    标签: objective-c ios nsoperation nsoperationqueue


    【解决方案1】:

    一般来说,UIKit 不是线程安全的。虽然您可能能够“摆脱”某些事情,但您应该始终在主线程上做 UIKit 的事情。有一些有据可查的例外情况。

    从后台线程执行此操作的模式很简单。

    dispatch_async(dispatch_get_main_queue(), ^{
        // Put any code you want to execute in the main thread here.
    });
    

    您传递给 dispatch_async 的块内的代码将被安排在主运行循环中运行。

    【讨论】:

    • 是的,总的来说,你是对的。但我想知道,既然 NetworkActivityIndi​​catorVisible 只是一个布尔值,它应该是线程安全的。但我也认为这个值控制指标开始/停止动画。所以它必须在主线程中运行。所以我不知道它是否在主线程中自动处理。感谢您的回复。
    • 比抱歉更安全 - 在主线程上调用它,除非 UIApplication 文档明确说从其他线程调用是安全的。
    • 你怎么知道它“只是一个布尔值”?你看过 UIKit 源代码吗?你能确定它不会改变吗?您正在向 UIApplication 的一个实例发送消息,它是 UIKit 的一部分,它的文档说除了主线程之外的一些特别注意的事情之外不要做任何事情。因此,您不应该这样做。你能摆脱它吗?可能,但为什么还要这样编码呢?编写故意违反 API 记录使用原则的代码可能会带来什么好处?我确信有这样的使用案例,但这肯定不是其中之一。
    • 哇,谢谢,我之前是在创建主线程方法,但这要容易得多。