2014-02-21 54 views
0

我想知道您的意見是什麼是最好的方法來做到這一點。iOS最佳實踐 - 更新父視圖集合中的對象

我有一個視圖控制器(EventsController)與UITableView。它從後端應用程序獲取事件數據並將它們存儲在實例變量events(NSArray)中。它使用events數組填充表視圖。

當用戶點擊表格中的某一行時,它們被帶到另一個視圖控制器(EventDetailController)。在segue期間,EventDetailController傳遞選定的事件對象。 細節控制器讓用戶關注或取消關注此事件。當用戶關注/取消關注將信息發送到後端的事件時。目前在從後端接收到成功響應之後,詳細控制器發佈通知,讓觀察員知道事件發生了變化。 EventsController觀察此通知,並在獲取通知時重新加載自身(從後端獲取所有事件並重新加載表)。我認爲這是過度的(順便說一下,這個通知也被EventsController以外的視圖使用,我認爲這就是爲什麼他們會使用通知而不是協議/委託)。

我的問題是關於如何在EventsController中更新已更改的事件而不需要到後端。 請注意,兩個控制器均位於導航控制器內。

  1. 在segue期間,將所選事件對象傳遞到詳細控制器 ,正如現在所做的那樣。來自後端的成功響應 的詳細控制器更新這個非常事件對象。所以事實上,EventsController中事件數組中的對象 將被更新。 EventsController可以在 viewWillAppear中觸發表格的重新加載,並且當用戶 導航回到EventsController時,反映將會反映出來。
  2. 使用協議/委託方法讓EventsController知道 事件被關注或取消關注。
    • a。在調用協議方法的EventsController中,查找數組中的事件(它們具有唯一的ID 屬性),更新它並重新加載表。
    • b。或者在EventsController中不僅維護一個事件數組,而且還維護一個字典(鍵將事件ID和值將是該事件數組中的 對象的索引)協議方法被調用,它可以查看 上找到事件更快在數組中並更新它。並致電 重新加載表。

你會用哪種當前方法,1,2.A或2.B?謝謝。

回答

1

我會將事件分成模型類。你可以在EventsController中實例化它,並通過一個屬性將它傳遞給EventDetailController,或者你可以讓它成爲整個應用程序可以訪問的單例。在事件詳細信息中更改事件時,只需在EventModel類中更新事件,然後讓模型類廣播通知,或僅通過KVO觀察事件數組。 (只是一個警告:如果你爲事件數組使用了一個可變數組,那麼改變集合中的一個對象不會觸發KVO通知,你必須替換數組來獲得自動註釋。)

通過這種方式將模型分離出來後,您會發現從網絡服務中重新加載,保存事件,修改事件等任何事情都非常容易。

+0

啊,這是一個很好的解決方案。當你說模型時,你不一定是核心數據,是嗎?該模型可以是一個單數表示所有事件的數組? EventsController可以將選定的事件索引傳遞給細節控制器。 – septerr

+0

不需要核心數據。只是一個具有一系列事件的類,您可以根據需要修改/觀察事件。 – jsd