在UI更新事件之前是否处理了NSNotificationCenter postNotificationName发布的事件?
我需要知道,否则我的当前程序会在极少数情况下崩溃。
型号代码:
- (void)searchFinishedWithResults:(Results *)results {
self.results = results;
// If some table cells are loaded NOW, before notication is processed, we might crash!
[[NSNotificationCenter defaultCenter]
postNotificationName:SearchResultArrived object:nil];
}
处理通知时,我将运行UITableView reloadData。
但是,请考虑在处理通知之前,是否必须更新UI。在这种情况下,-tableView:cellForRowAtIndexPath:将调用indexPath,但结果对象已更改,它将获取旧数据。
答案 0 :(得分:5)
当您以同步方式调用postNotification:或postNotificationName:object:时,将完全调度通知,一个观察者接着另一个(无特定顺序)。在您显示的情况下,它们将在您分配变量“results”之后和方法结束之前完全发送。
答案 1 :(得分:1)
直接来自Apple's documentation on NSNotificationCenter:
通知中心提供 向观察员发出通知 同步。换句话说, postNotification:方法没有 回到所有观察者都有 收到并处理了 通知。
以异步方式发送通知 使用NSNotificationQueue。
答案 2 :(得分:0)
顺便说一句,我认为你需要重新考虑你的设计。听起来你在视图和模型之间没有足够的分离。
您的数据模型应该知道什么是旧数据,哪些不是旧数据,只应将当前数据返回到tableViewController。数据模型应该完全控制数据的完整性,不应该强制它返回错误的数据。由于这种强制,应用程序肯定不会崩溃。