2010-01-04 38 views
3

是否在UI更新事件之前處理由NSNotificationCenter postNotificationName處理的事件?NSNotificationCenter通知的優先級高於UITableView單元加載事件嗎?

我需要知道,否則我的當前程序將在一些罕見的情況下崩潰。

型號代碼:

- (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,但結果對象已更改,它將提取舊數據。

回答

5

當您以同步方式調用postNotification:或postNotificationName:object:時,一個觀察者在另一個觀察者之後(不按特定順序)發送通知。在你顯示的情況下,它們會在你分配變量「results」並且在方法結束之前發送。

1

直接從Apple's documentation on NSNotificationCenter

通知中心提供 通知觀察員 同步。換句話說, postNotification:方法不會返回 ,直到所有觀察者都有 收到並處理了 通知。

異步發送通知 使用NSNotificationQueue。

0

另外,我認爲你需要重新考慮你的設計。這聽起來好像你在視圖和模型之間沒有足夠的分離。

你的數據模型應該知道什麼是和不是舊數據,應該只返回當前數據到tableViewController。數據模型應該完全控制數據的完整性,並且不應該強制它返回錯誤的數據。由於這種強制,應用程序肯定不應該崩潰。

+0

我不認爲這是這種情況。如果你看一下上面的代碼,這就是NSNotificationCenter的一個完美例子--OP只是通知觀察者搜索結果已經到達,並且基於這個通知,他可以執行一些合法的東西,比如在搜索結果視圖中動畫,或者自動解散'模態加載'視圖等。代碼不顯示不正確的結果管理不正確否則。 – strange 2014-02-20 21:53:57