除了主线程之外,不要更改 UI。虽然它可能看起来可以在某些操作系统或设备上运行,但在其他操作系统或设备上则不行,但它必然会使您的应用程序不稳定并意外崩溃。
如果您必须回复通知,则can在后台发生,然后确保UIKit
调用发生在主线程上.
你至少有这两个选择:
异步调度
Use GCD
(大中央快讯)如果您的观察者可以在任何线程上收到通知。您可以从任何线程监听并执行工作,并将 UI 更改封装在dispatch_async
:
dispatch_async(dispatch_get_main_queue()) {
// Do UI stuff here
}
何时使用GCD
?当您无法控制谁发送通知时。它可以是操作系统、Cocoapod、嵌入式库等。GCD
每次都会随时醒来。缺点:你发现自己需要重新安排工作。
在主线程上收听
您可以方便地指定希望在哪个线程上通知观察者,在您注册时对于通知,使用queue
范围:
addObserverForName:@"notification"
object:nil
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification *note){
// Do UI stuff here
}
When to 在主线程上观察?当您既已注册又已注册时。当您回复通知时,您已经到达了您需要到达的地方。
在主线程上发布通知
[self performSelectorOnMainThread:@selector(postNotification:) withObject:notification waitUntilDone:NO];
混合解决方案不保证观察者仅从所述方法中调用。它允许更轻的观察者,但代价是设计的稳健性较差。这里仅作为解决方案提到你可能应该避免.