0

我寫了我的第一個應用程序,它使用Web數據來構建自定義視圖。雖然它在工作,但我不禁認爲它可能並不完全遵循MVC概念(我不確定這是否會影響蘋果如何批准應用程序)。MVC與網絡查詢

我有一個單一的視圖控制器與自定義視圖類,實現drawRect。由於drawRect需要來自網絡的數據,所以在自定義視圖類本身中進行所有下載感覺很自然。

但是,這通常如何完成?我猜測,視圖控制器通常應該處理下載,並且控制器是異步下載的代理,因此它可以根據錯誤等安排視圖等。相反,我的自定義視圖類是處理異步的代理,而且這對我來說看起來很糟糕。但也許它不是?

如果我想在所有下載中使用View Controller,我想我只是將自定義視圖的實例變量設置爲下載結果,因爲自定義視圖需要繪製數據。這會是一個更好的方法嗎?

回答

1

蘋果公司並沒有將您的源代碼視爲App Store審覈過程的一部分,因此您如何設計您的課程取決於您。然而,你認爲在MVC體系結構中,視圖不會獲取他們自己的數據,事實上從來不知道它們呈現的數據來自何處。控制器層充當視圖和模型對象之間的橋樑,因此適當提取數據的責任在於此。

所以我認爲你是在正確的軌道上:使用UIViewController的子類的實例來獲取數據。從那裏開始,決定將數據「推」或「拉」到正在設計的UIView子類中更有意義。

在推模式中,控制器根據需要設置視圖的實例變量以呈現數據。在拉模型中,視圖通常會在繪製之前向控制器發送消息以請求數據。 iOS中的典型模式是讓控制器採用頭文件中爲您的自定義視圖類聲明的委託協議。然後,視圖會在需要時嘗試獲取數據,方法是首先檢查其委託是否實現必要的方法,然後調用方法(如果可用)。

+0

我會傾向於說這項工作並不在控制器中,但我可以開放辯論,因爲我真的不確定。我喜歡把'M'和'V'想象成相當靜態的'C'周圍的可交換組件。如果你把這個邏輯放在'Model'中,那麼'Controller'只是要求數據傳遞給'View'。如果我們創建'Model'句柄,那麼我們可以在不影響View或Controller的情況下交換數據的後備源(比如我們緩存到本地文件或決定我們想從數據庫獲取數據)。這個'Model'現在也可以被多個'Controllers'重複使用。只是我的想法。 –

+0

模型對象如何知道何時獲取? – jlehr

+0

'Controller'告訴它。控制器本質上會創建模型並說'myViewLabel = [model getLabelContent];(簡化的人爲的例子)。模型對象可以從網上抓取,一個文件,一個sqlite ......沒關係,'controller'不關心它只是想將數據傳遞到視圖 –