我來自.NET的Web應用程序背景,並剛剛開始iOS開發。我的應用程序的初始設計主要圍繞NSNotificationCenter。我對此非常滿意,直到我看到各種帖子解釋NSNotificationCentre是如何成爲常見的新手錯誤。這是NSNotificationCenter的有效用法
這裏有一個問題,我試圖解決的一個簡化版本:
我的應用程序試圖顯示了使用Web服務調用填充的郵件列表,認爲Facebook的消息。
當應用程序第一次加載時,它會從服務器中提取一組消息並將它們顯示在表中。用戶可以添加新消息(通過API發回),並且該應用可以接收關於添加到該消息的新消息的推送通知。
消息永遠不會保存到磁盤,所以我只是使用POCO模型來保持簡單。
我有一個MessageFeedController負責填充消息訂閱源視圖(在故事板中)。我還有一個消息提要模型,它存儲當前檢索的值並具有各種方法:
- (void)loadFromServer;
- (void)createMessage:(DCMMessage *)message;
- (void)addMessage:(DCMMessage *)message;
- (NSArray *)消息;
- (int)unreadMessages;
當前實現我是這樣的:
用例1:初始加載
- 當視圖第一次出現的 「loadFromServer」 方法被調用。這填充消息集合並引發NSNotificationCenter事件。
- 控制器觀察到這個事件,並獲得當它填充的tableview
使用案例2:新郵件
- 當用戶點擊「添加」按鈕,將出現一個新的觀點,他們進入他們的消息,點擊發送,然後視圖被駁回。
- 這需要在模型上的CreateMessage方法,一旦我們有了模型引發NSNotificationCenter事件
- 再次MessageFeedController偵聽此事件,並重新填充表的響應,其調用API
- 一個推送通知,而應用程序是開放的,與新的消息詳情 :
- 的AppDelegate中(或其他類)將調用方法addMessage方法的模型,它
- 再次添加到集合中,假設MessageFeed觀點是開放的,它重新填充
使用案例
在所有MessageFeed視圖被更新的三種情況。除此之外,BadgeManager還監聽這些事件,這些事件負責設置應用程序圖標徽章和標籤欄徽章,在這兩種情況下,徽章號碼都與未讀郵件的數量有關。
也有可能另一個視圖處於打開狀態並正在偵聽這些事件,此視圖包含消息摘要,因此需要知道集合何時更改。
對,感謝您堅持與我,我的問題是:這似乎是NSNotificationCentre的有效使用,還是我誤用了它?
我擔心的一個問題是,如果通過重新填充消息表,消息集合發生變化,我將不會100%確定會發生什麼情況。我唯一能看到這種情況的是如果收到關於新消息的推送通知。在這種情況下,無論如何,表格中的人員必須在完成NSNotification之前完成?
感謝您的幫助
丹。
沒有試圖給出真正的答案,我會根據我見過的代碼評論「濫用」。兩種主要的O-C對象之間的解耦通信方法是委託協議和通知。第一個意思是某個對象將輔助函數實現爲另一個對象的服務;它的存在是已知的並且明確地使用。第二種模型是一個較弱的關係,其中一個對象聲明一個事件,零個,一個或多個對象決定採取行動。人們有時會造成這些屬性和需求的不匹配。 –