2014-06-09 83 views
9

我一直在爲NetworkCommunication開始設計。我有一個設計,其中NSOperation子類創建和管理自己的NSURLConnectionNSOperation子類由NetworkManger類實例化,該類將其添加到NSOperationQueue。一旦請求完成,代表(例如:ViewController將被調用)。這是流程:用NSURLSession代替NSURLConnection

網絡管理器實例化NSOperation子類(封裝URL,參數等),並將其添加到它維護的NSOperationQueue。 的NSOperation子類實例化NSURLConnection(其執行asynchronous請求和數據檢索) NSURLConnection轉儲數據的NSOperation子類 的NSOperation子類執行由委託(視圖控制器)提供的完成塊。 我正試圖用NSURLSession來實現相同的模式。我希望能夠封裝在單個對象內發出網絡請求所需的url和參數。

如果我使用NSURLSession,我使用相同的模式,這是否正常。我檢查了AFNetworking類。但是,他們還沒有爲NSURLSession劃分NSOperation。此外,會話對象應該放在哪裏。它會成爲NSOperation班的一部分嗎?

有人可以就此提供一些專家建議。我應該可以取消請求,上傳(POST/PUT),下載數據。網絡管理員類將成爲任何網絡請求的單一聯繫人。

+0

@Bhavesh Nai,請不要在預先編輯時加上'thanks in advance'或其他稱呼,他們會被視爲'噪音'http://meta.stackexchange.com/questions/2950/shouldhi -thanks-taglines-and-salutations-be-removed-from-posts –

+0

對不起@ SeanO'Toole –

+0

有人可以回答這個問題,而不僅僅是編輯。這裏沒有iOS專家嗎?PLs幫助 – user694688

回答

17

更新:

NSURLConnection已經過時有效的Mac OS 10.11和iOS 9.所以,在這一點上應該NSURLSession代替NSURLConnection使用。作爲NSURLConnection.h頭說:

已過時:NSURLConnection類不應再使用。 NSURLSessionNSURLConnection的替代品。

我的原始答案如下。


答案取決於你是否需要的各種NSURLSession委託方法或不豐富。如果使用完成塊再現(即無進度回調,無流式傳輸等),則從NSURLConnectionNSURLSession的轉換非常簡單。只需將NSURLSession實例放入NetworkManager類中,然後將基於NSURLSessionTask實例的代理包裝在併發NSOperation子類中,即可完成。只需採用標準的異步/併發NSOperation子類模式。

如果您使用NSURLSession的基於代表的渲染,它是一個完全不同的水壺。主要的麻煩是在會話delegate上調用各種NSURLSessionTask委託方法,而不是任務委託對象。乍一看,這可能聽起來像是一個微不足道的問題,但是,如果您的操作實例具有唯一的完成/進度模塊,例如,您會陷入如何讓會話對象將這些委託方法回調映射到個人的麻煩中原始請求操作實例。

要解決這個問題,您必須保持任務標識符到您的子類對象的映射。然後,您可以在各自的NSOperation子類中實現這些NSURLSessionTask(包括任務,下載任務和上載任務)委派方法。然後NSURLSession網絡管理器類可以在它接收到NSURLSessionTask委託調用時使用任務標識符來標識適當的NSOperation實例,然後在那裏調用相應的委託方法。

最後,如果你打算處理背景NSURLSession實例,生活會變得更加困難(因爲後臺任務將會繼續,即使你的應用已經終止並且所有的對象都被丟棄了)。背景會議根本不適用於基於NSOperation的方法。底線,如果您只需要完成塊NSURLSession方法,這是微不足道的,但如果您需要基於委託的演繹方法,則會有點麻煩。

+1

感謝Rob。這是我現在的理解:如果我們要採用基於塊的方法,NSOperation很好。但是,如果我們要採用基於代表的方法,那麼我們必須管理這些任務。我的疑問是:如果我有NSOperation子類實現任務級別委託方法,那麼問題是什麼。請解釋一下。我沒有明白。 – user694688

+1

@ user694688我不是說你不能在基於委託的'NSURLSession'中使用基於操作的方法,而只是需要更多的工作。 – Rob

+3

例如,假設您有兩個網絡請求,包含在他們自己的操作中,其中一個正在下載圖像,另一個請求JSON。當NSURLSession有委託調用任務委託方法時,它如何知道調用的目的是哪個操作(圖像或JSON)?有兩種合乎邏輯的方法:一種是針對每項操作設定一個單獨的會話(這在架構上似乎不雅)。另一種是讓公共會話實例維護哪個任務標識符屬於哪個操作的映射。 – Rob

相關問題