2015-09-25 70 views
0

在我的iOS應用中,許多ViewController需要根據用戶輸入和操作發送/接收來自服務器的數據。我將爲我所有的網絡活動使用NSURLSession。但我不想讓每個ViewController都符合NSURLSession委託協議並重復所有的方法。在視圖控制器中共享NSURLsession委託實現

我看到了兩個解決方案

  • 創建符合NSURLSession委託 協議的類。其他類創建該類的一個實例,並使用它的方法從服務器發送/接收數據。處理所有網絡的類的重用將通過重載其init方法使用單例設計模式完成,以便僅創建它的實例。

    • 這種方法的缺點似乎是單身人士使得創建單元測試非常困難,因爲單元測試完全可以將每個類的功能與其他人隔離開來。 I.e.Suppose一個錯誤只發生,因爲viewcontroler1問「共享類」發送一個特定的消息跟隨viewcontroller 2問它發送一些其他消息。那麼使用單元測試是不可能的。
  • UIViewController的子類,它實現了我的ViewControllers的方法和子類。這裏

    • 的一個問題是,如果我有各種不同的意見的應用程序,那麼我就需要用NSURL會議委託方法每種視圖控制器的創建子類。我必須謹慎地將方法分配給委託對象。當我看着它,我覺得這種方式也有同樣的單元測試問題,方法1.

我將不勝感激 1.其他途徑的任何意見在類似的情況 2使用了。以上方法的優點/缺點(包括上面列出的2)。我意識到這可能有點主觀,但恕我直言,在設計模式上獲得好建議與我的代碼或使用哪個API解決問題的問題的答案一樣重要(甚至更重要)X

+1

「創建一個符合NSURLSession委託協議的類」。如果一次只有一個連接可以處於活動狀態,並且/或者在視圖控制器被銷燬後應該繼續連接,則將其設置爲單例。否則,每個視圖控制器可以使用該類的單個實例。 – Gruntcakes

+0

謝謝,因爲用戶可能會發送一個文件,然後a)將應用程序放入後臺或b)移動到應用程序中的另一個屏幕,我認爲最好採用單例方法。但是我看到一些關於單身人士是壞事的可怕的東西。恕我直言,所測試的可測試性問題似乎也適用於其他方法。所以,我認爲我可能會這樣做。 –

回答

1

這樣,我已經在過去這樣做是:

1)創建了一個包含一個NSURLSession對象 @interface CustomSession類:NSURLSessionDelegate @property(非原子,強)NSURLSession * MySession的;

2)在CustomSession init方法初始化MySession的,委託設爲自我。

3)在CustomSession中實現了所需的NSURLSession委託方法。

4)使用塊方法(可選的,但我更喜歡他們)

5)決定是否要使用CustomSession作爲一個單身或每次你需要它的時候實例化。實際上你可以只是相應地定義init方法。

+ (CustomSession *)session 
{ 
    //Singleton 
} 

+ (instancetype) newClient{ 
    //normal init method} 

6)作爲單元測試,你可以在CustomSession父VC弱指針(正如你所指出,這將如果你不使用一個Singleton工作)。

快速建議:使用AFNetworking,將簡化您的生活。例如,我使用AFHTTPSessionManager和提供的相應塊方法: [self GET:detailsURL parameters:parameters success:^(NSURLSessionDataTask * task,id responseObject)

+0

謝謝@codinpora。由於用戶可以發送/請求文件和a)將應用程序放在後臺或b)移動到應用程序中的另一個屏幕,我不需要單獨的方法。你看到任何方式嗎?我在考慮AFNetworking,但也想在「靈活的方式」下學習SDK,以防AFNetworking無法提供靈活性。通過AFNetworking,我發現你只需要給出「成功」或「失敗」時要執行的內容塊,他們如何處理用戶從一個屏幕移動到另一個屏幕等情況?採用它會更好地編寫更好的單元測試代碼嗎? –

相關問題