NSNotificationCenter通知是否比UITableView单元加载事件具有更高的优先级?

时间:2010-01-04 13:21:01

标签: iphone objective-c

在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,但结果对象已更改,它将获取旧数据。

3 个答案:

答案 0 :(得分:5)

当您以同步方式调用postNotification:或postNotificationName:object:时,将完全调度通知,一个观察者接着另一个(无特定顺序)。在您显示的情况下,它们将在您分配变量“results”之后和方法结束之前完全发送。

答案 1 :(得分:1)

直接来自Apple's documentation on NSNotificationCenter

  

通知中心提供   向观察员发出通知   同步。换句话说,   postNotification:方法没有   回到所有观察者都有   收到并处理了   通知。

     

以异步方式发送通知   使用NSNotificationQueue。

答案 2 :(得分:0)

顺便说一句,我认为你需要重新考虑你的设计。听起来你在视图和模型之间没有足够的分离。

您的数据模型应该知道什么是旧数据,哪些不是旧数据,只应将当前数据返回到tableViewController。数据模型应该完全控制数据的完整性,不应该强制它返回错误的数据。由于这种强制,应用程序肯定不会崩溃。