2012-05-23 167 views
1

我試圖找出在我的應用程序中實現MVC設計的最佳方法。現在,當用戶進入UITableViewController時,我會向我的模型發送請求以訪問Internet並下載一些數據。當數據返回時,我希望它能夠更新數據,即使我的UITableViewController被交易(由用戶關閉視圖或退出視圖)。所以目前我更新了模型,然後在模型上有一個委託來在UITableViewController上「更新UI」。基本上在數據返回之後,我希望模型調用[tableView reloadData],並使用委託實現此功能。NSURLConnection MVC最佳實踐

我的問題:

  1. 這是一定正確的方法是什麼?有沒有其他方法可以讓我的模型在我的UIViewController上調用方法?

  2. 如果我希望在模型更改時通知多個ViewController,例如,如果退出UITableViewController1然後導航到UITableViewController2並使用相同的模型/數據,該怎麼辦?我應該在模型上創建多個代表嗎?

只是尋找一些最佳實踐,並想知道我是否正確地做到了這一點。

在此先感謝。

回答

1

您可以使用NSNotification來提醒收聽者的更改,或Key-Value Observing(KVO)。兩者都是Observer Pattern的風格,這將幫助您從模型中刪除耦合到視圖,並作爲獎勵允許任意數量的觀察者查找有關模型的更改,而無需單獨告知所有模型。

有自動和手動更改通知。 This explains the difference

我敢打賭,你會做手工通知,所以你會做:

[self willChangeValueForKey:@"something"]; 
... // update 'something' here 
[self didChangeValueForKey:@"something"]; 

而且觀察員將得到通知。自動方法需要使用您可能不會在內部使用的屬性方法。通常KVO適用於模型的單個屬性,當然模型中可能有許多發送通知。如果你正在按照「我剛剛完成過程X」的方式做更多的事情,那可能更多的是NSNotification。

+0

對於KVO,在解析來自Web請求的XML數據並更改模型後,它會自動通知註冊更改通知的VC?那時如果模型是一個對象數組,我可以調用tableView:insertRows:atIndexPaths? – VTS12

+0

Yikes ...格式在評論中效果不好。我更新了響應以添加有關手動/自動KVO的一些信息。 –

0

回答問題2 - 如果你有一些對象,應該通知一些事件,你應該使用NSNotifications(觀察者模式)。這可以幫助您輕鬆地使這些對象發生反應,更新他們的視圖等。

+0

我讀過使用NSNotifications可以使應用程序非常難以管理。我們有很多HTTP請求進出​​多個模型。這是一個好主意還是應該由多個代表完成?這甚至有可能嗎? – VTS12

+0

你可以看到[這裏](http://stackoverflow.com/questions/1927965/nsnotificationcenter-vs-delegation-using-protocols)他們之間的差異。據我所知,所有用通知編寫的代碼都可以由代表重寫。在你的情況下,我認爲通知比代理更容易做到 – medvedNick