2012-03-31 94 views
10

所以,我有2種類型的數據,有些需要保留,有些則不需要。iPhone - 視圖控制器和網絡請求的體系結構

我在想在哪裏把我所有的網絡相關的代碼放在我的UIViewControllers裏面,所有的網絡請求都從其他層開始。

我腦子裏想的是這樣的:

有一個名爲NetworkManager層。 NetworkManager是singerlton我所有的網絡服務電話。

對於需要持久,並且可以在列表中呈現,我會網管數據發出請求,保存在我的本地核心數據DB的響應,並有我UIViewController聽使用FetchResultsController數據。

但是,還有很多其他類型的請求。例如:登錄請求,用戶信息請求,friendsNearBy等等......有些不必在我的數據庫中持久化,有些不適合FRC體系結構。

對於這些類型的請求,據我看到的,有處理它2種方式:

1.具有與ViewControllers和網絡管理器之間分離的另一層。 我們稱之爲MediatorMediator從網絡管理器獲取字典(JSON)請求,根據應用邏輯決定是否還有其他需要完成的操作,然後發佈具有適當名稱和數據的通知。如果中介保存發出請求的UIViewController,它可以直接將響應委派給他,而不是發佈通知。

流會是這樣:

MyUiViewController - > Mediator -> NetworkManger->Mediator-> PostNotification (or directly back to MyUiViewController) 

Pros: 
Decoupling 
Nice structure and separation of concerns 

Cons: 
Harder to code 
Sometimes harder to understand and debug. 

2.不具有本3分層架構,而是具有MyUiViewControllers,發出帶有區塊的網絡請求。含義不是Mediator在MyUiViewController之前攔截響應,只是讓MyUiViewController使用塊處理響應,因爲他是發出響應的響應。

Pros: 
Simple and quick to code 
Easy to understand 

Cons: 
Coupling of network code inside your controllers 

我希望能得到關於什麼是最好的從人們的經驗,或者這樣做的其他/更好的方式提出建議和意見。

回答

1

你有什麼最好的方法了嗎?

這是我一般做,

有一個NetworkManager的是不是單身。用方法OnSuccess,OnError定義一個協議。在啓動網絡連接的ViewController中實現它。在NetworkManager上設置委託,並在執行異步請求時調用委託。

使用代表而不是塊,因爲它易於維護。

這可能不是最好的解決方案,但希望它能給你一些指示。

1

我推薦選項2,其中包含一些您列出的選項1。在我的應用程序中,我傾向於有兩種不同的操作模式同時運行。

自動下載: 應用程序基本數據被下載並直接保存到數據庫。每次應用程序激活時,它都會啓動。隨着每個請求完成,NSNotification將發送給任何可能需要了解新數據的可見視圖控制器。

例如,如果我保存玩家數據,我會發送像「PlayerDataUpdated」這樣的通知。當視圖控制器可見時,它會偵聽通知。當它不可見時,它不會偵聽通知,因爲在viewWillAppear期間將發現對數據庫的任何更改。

用戶啓動下載: 對於用戶發起的網絡請求,如拉刷新,你應該叫從需要更新的數據視圖控制器NetworkManager的適當方法。