2011-04-28 64 views
0

我在模型中有一個對象,當被修改時需要大量其他對象根據這些更改重新計算值。核心數據:觸發一個屬性更改的長時間運行

這是目前設置的方式是,這一個對象只能在一個地方修改。這是一個帶有「取消」和「確定」按鈕的表單。一旦用戶提交了更改,工作表就會顯示一個進度條並開始處理受該更改影響的對象。表單的提交和解除包裝在一個NSUndoManager組中。用戶可以在解散表單後一次性撤消所有更改。

困擾我的是我一直在想,所有這些都應該發生在商業層面。而不是在控制器級別。即我應該能夠修改我的業務對象在UI和代碼中的任何地方,並讓它觸發必要的計算。

所以我會設置KVO來觀察我的對象,並在需要時觸發長時間運行的操作。一旦我走下那條路,我就開始撞牆。

  • 如何合併更改?我的對象有幾個屬性。我不想在第一個屬性發生變化時開始計算,而第二個屬性接下來可能會發生變化。基本上我需要一個編輯表和一些控制點一次提交所有更改。

  • 如何將UI添加到此長時間運行的操作中?我可以將NSOperationQueue附加到NSManagedObjectContext並讓我的窗口控制器觀察。當隊列不空時,我會彈出一張帶有進度條監控當前操作的工作表。

  • 如何實現撤消/重做支持?如果我將重新計算延遲到事後運行的操作,我無法想象如何撤消初始更改並同時傳播一次。我只能想象撤消原來的變化,並觸發對所有其他對象的另一次重新評估。

簡而言之:

什麼是這種依賴關係的最佳做法是什麼?

傳播是模型層還是控制層的工作?

回答

0

我相信我想出了一個解決方案:

  • 中心片模型對象手錶本身的變化對變化
  • ,它創建或修改了一個ToDo對象
  • 控制器手錶新ToDo對象
  • 控制器使ToDo出隊,呈現進度條並執行操作