2012-08-22 24 views
0

我正在爲iPhone的應用程序工作,我從PHP服務器加載JSON,解析它與庫,並創建一個對象與此數據。我的代碼工作正常,但我這樣做的方式似乎錯了我:正確的方式來設計數據加載和對象創建

viewController向用戶顯示加載視圖。同時,ViewController會發出請求並接收數據。 的VC解析響應,並得到一本字典 字典被髮送到「創一流」誰返回從字典

創建的對象我這樣做操作兩次,但我認爲這是一個不好的設計:

視圖控制器應該執行http請求嗎?不要成爲「objectLoader」?創建類的主要方法,使一大束的if/else意大利麪,如:

for(NSString key in dictionary){ 
    if(key isEqualToString "a key"){ 
     perform action 
    } 
    else if(key isEqualToString "an other key"){ 
     perform action 
    } 
    .... 
} 

任何想法來解決呢?我在想使鍵/選擇器的字典來解決它,這樣做:

for(NSString key in dictionary){ 
    [self performSelector:[selectors getObjectForKey:key]] 
} 

但我不知道我是否可以在字典引用一個選擇......

最後其他的選擇,我發送解析的字典與對象類的方法,如:[ClassName createObjectWithDictionary:parsedDictionary]。這是一個很好的方法來做到這一點?

我知道這個問題有點曖昧,但我應該申請什麼設計模式,我有點失落,誰負責什麼,在這個故事

回答

2

最好的方法是使用MVC模式,並使用具有方法來推送和刪除其中的一些數據的數據模型以及在更改模型數據的情況下通知的代理列表(從UIViewController派生)。控制器(不是UIViewController)是啓動從服務器獲取數據並處理結果的東西。 所有的UIViewControllers處理數據更改和用戶交互。 現在,寫一些處理請求例程並存儲所有必要數據以觸發控制器中的事件的RequestController(單線程或不管)。 您可以使用塊或NSNotificationCenter來處理請求的完成。 通過RequestController從請求中獲取必要的數據後,您的Controller可以創建必要的解析器並將解析的數據推送到模型中。

+0

感謝您的答案!我很抱歉,因爲我不知道我是否理解你的方法。 UIViewController應該創建控制器?我應該爲每個請求類型擁有一個控制器嗎?所以控制器應該是UIViewController和從我的服務器加載對象的模型之間的中間人?控制器應該處理收到的數據?爲了解決我的問題,我正在努力學習設計我的軟件的最佳方式。 – Jpellat

+0

「UIViewController應該創建控制器?」 - 不是必需的,它可以由應用程序委託創建並從viewController進行設置。 「我應該爲每個請求類型都有一個控制器」 - 不,我的建議是讓控制器負責確切的角色。一個 - 用於加載公共數據,一個用於加載資源等。 「所以控制器應該是UIViewController和我的服務器上的對象加載模型之間的中間人?」 - 是的,這樣的。 「控制器應該處理收到的數據?」 - 這取決於,如果你有數據請求控制器,你可以將 –

+0

數據處理移動到相應的viewController,但是如果你有控制器做特定的數據請求,它可以解析並且通知viewController關於新數據。 –

1

就個人而言,我不會讓視圖控制器做HTTP請求。我總是在我的應用程序中編寫服務類,這些類執行低層次的事情,並通過委託對調用者(例如視圖控制器)通知接收到的結果。

因此,在這種情況下,控制流程爲: - >視圖控制器鎖屏與加載消息 - >以自己爲委託調用服務 - 該服務所從事的工作,並收到了答案 - >答案被處理,結果傳遞給代理 - > ViewController接收響應,刪除加載消息並執行響應所需的任何操作。

關於第二個問題:是的,可以從字典中動態選擇一個選擇器 - 例如,通過將選擇器的名稱存儲在字典中,然後使用

SEL selector = selectorFromString(@"doWork"); 

來創建調用的正確選擇器。

+0

感謝您的回答!但我有一個疑問,你的服務應該像一個工廠模式,這取決於像url解析和創建並返回對象。或者字典過程應該是模型類的東西?我的問題是,在字典創建意味着很多類和服務將增長太多...... – Jpellat

相關問題