总是预防性地将 UI 更改包装到主线程中?
Always wrap UI changes into main thread preventively?
UI 更改应在主线程上进行。否则,它可能会导致错误行为、警告或崩溃(但有时它仍会按预期工作)。
无论如何,我已经开始总结 dispatch_async(dispatch_get_main_queue)) { ... }
中的几乎所有 UI 更改。最近我只是想知道这是否是对所有 UI 相关的东西这样做的最佳实践,所以每个 presentViewController
、dismissViewController
等等,因为代码被数百个这样的东西溢出了包装。
当然,有时候很明显不需要它;例如当用户点击一个按钮导致一些即时 UI 更改时。但是有些方法会在不同的上下文中调用,您可能应该通过预防性包装来确保它。最后,我开始在所有地方实施这些,否则你必须非常小心,不要误判或忘记需要的地方。
你的方法是什么?
我认为您应该每次都在主线程上显式调用 UI 更改,但是 仅在必要时。
原理:如果你还没有在主线程上,你只需要指定主线程。例如,在实现 viewDidLoad
或 table 视图 datasource
方法的 UIViewController
子类中,您可以假设您已经在主线程上。因此,将此处的 UI 语句包装到额外的 async
块中是多余的,并且会产生混乱且不必要的冗长代码。
另一方面,如果您在某个后台线程中,您应该明确表示您正在主线程中执行某些操作。这将增加清晰度并增强可读性和可维护性。
UI 更改应在主线程上进行。否则,它可能会导致错误行为、警告或崩溃(但有时它仍会按预期工作)。
无论如何,我已经开始总结 dispatch_async(dispatch_get_main_queue)) { ... }
中的几乎所有 UI 更改。最近我只是想知道这是否是对所有 UI 相关的东西这样做的最佳实践,所以每个 presentViewController
、dismissViewController
等等,因为代码被数百个这样的东西溢出了包装。
当然,有时候很明显不需要它;例如当用户点击一个按钮导致一些即时 UI 更改时。但是有些方法会在不同的上下文中调用,您可能应该通过预防性包装来确保它。最后,我开始在所有地方实施这些,否则你必须非常小心,不要误判或忘记需要的地方。
你的方法是什么?
我认为您应该每次都在主线程上显式调用 UI 更改,但是 仅在必要时。
原理:如果你还没有在主线程上,你只需要指定主线程。例如,在实现 viewDidLoad
或 table 视图 datasource
方法的 UIViewController
子类中,您可以假设您已经在主线程上。因此,将此处的 UI 语句包装到额外的 async
块中是多余的,并且会产生混乱且不必要的冗长代码。
另一方面,如果您在某个后台线程中,您应该明确表示您正在主线程中执行某些操作。这将增加清晰度并增强可读性和可维护性。