总是预防性地将 UI 更改包装到主线程中?

Always wrap UI changes into main thread preventively?

UI 更改应在主线程上进行。否则,它可能会导致错误行为、警告或崩溃(但有时它仍会按预期工作)。

无论如何,我已经开始总结 dispatch_async(dispatch_get_main_queue)) { ... } 中的几乎所有 UI 更改。最近我只是想知道这是否是对所有 UI 相关的东西这样做的最佳实践,所以每个 presentViewControllerdismissViewController 等等,因为代码被数百个这样的东西溢出了包装。

当然,有时候很明显不需要它;例如当用户点击一个按钮导致一些即时 UI 更改时。但是有些方法会在不同的上下文中调用,您可能应该通过预防性包装来确保它。最后,我开始在所有地方实施这些,否则你必须非常小心,不要误判或忘记需要的地方。

你的方法是什么?

我认为您应该每次都在主线程上显式调用 UI 更改,但是 仅在必要时

原理:如果你还没有在主线程上,你只需要指定主线程。例如,在实现 viewDidLoad 或 table 视图 datasource 方法的 UIViewController 子类中,您可以假设您已经在主线程上。因此,将此处的 UI 语句包装到额外的 async 块中是多余的,并且会产生混乱且不必要的冗长代码。

另一方面,如果您在某个后台线程中,您应该明确表示您正在主线程中执行某些操作。这将增加清晰度并增强可读性和可维护性。