3

我正在開發基於網絡的iOS應用程序,用於從服務器下載JSON數據並對其進行處理。下載任務和處理任務都需要很長時間才能完成,所以我不想在主線程中執行任何操作。在後臺執行網絡和其他耗時任務

我認爲有2種方式來做到這一點:

  1. 使用NSURLConnection執行異步加載,並在didFinishLoading方法使用GCD(說)做加工的背景。

  2. 使用GCD的dispatch_async(比方說)在後臺開始工作,並使用NSURLConnection'ssendSynchronousRequest:returningResponse:error同步下載的數據,進行數據處理,並調用UI更新在主線程上。

我認爲第二個方法是更容易編寫和將產生更乾淨的代碼,特別是當一個「下載/處理」任務涉及多個連續的服務調用的數據下載。因此,而不是執行會喜歡:

主(開始) - >背景(下載) - >主(NSURLConnectionDelegate方法) - >背景(數據處理) - >主(UI更新

,我們將有:

主要(開始) - >背景(下載) - >背景(數據處理) - >主要(UI更新) 這似乎是更清潔的我。

我發現2個類似的問題:Good pattern for Internet requests with Grand Central Dispatch?
NSURLConnection and grand central dispatch

而且答案似乎都使​​用概念上類似於方法1

一些建議是否有達到什麼沒有描述有道在方法2中?

在此先感謝!

+1

看看[AFNetworking](https://github.com/AFNetworking/AFNetworking)。 – 2013-03-07 04:50:05

+0

@MikeD,AFNetworking可以另外在這裏執行的是在後臺執行JSON解析,不是嗎?如果我需要對解析的JSON對象執行昂貴的處理,該怎麼辦?我認爲我正在尋找的是一個設計模式比框架更多:) – wingman123 2013-03-07 05:04:58

+0

我總是使用第二種方法,但第一種方法的優勢之一是在iOS 6之前,如果您想要超過240秒的超時請求,它可能取消異步連接。 – prasad 2013-03-07 05:32:12

回答

0

我不會傾向於追求選項#2。儘管它具有一定的簡單性,但在下載過程中不會提供進度更新,取消請求(以及其他更復雜的方案)的能力。採用NSURLConnectionDataDelegate方法可以更好地控制網絡請求。

這個問題假設基於GCD的模式,但我認爲操作隊列模式值得考慮。您可以將NSURLConnectionDataDelegate方法提供的控件與封裝網絡請求的可取消操作結婚。當您開始變得更加複雜時,您可以開始使用併發請求,但也會限制併發程度(例如,不超過五個併發請求)。

我建議看看AFNetworking。也許你不想使用這個框架,但我仍然會看看它使用的基於操作隊列的模式。我個人會將這種模式用於上述任何一種GCD方法。