2013-03-24 58 views
8

我有一個NSArray的鏈接。我想通過在線文章提取器API(Clear Read)解析它們,並將結果返回給每篇文章(某些HTML),然後將它放入NSStringNSURLConnection和多個異步請求 - 是否與正在傳輸的數據混淆?

我的問題來自這樣一個事實,即我的數組中有100個URL,我循環訪問每個項目的數組,並將結果返回給JSON。這就像是異步激活100 NSURLConnection調用。

我不確定這是否會有問題,但是當我給它100個URL(實際字符串,沒有零)時,返回的數據通常具有JSON鍵的空值(當它們應該't),或返回的數據是nil。還有一堆重複。

我是否應該比現在更好地處理多個異步連接?如果是這樣,怎麼樣?

回答

8

一對夫婦的想法:

  1. 如果你正在做的併發異步請求,並使用異步NSURLConnection,那麼你要定義你自己的類此下載操作,以確保每一個連接跟蹤自己的屬性。這樣,所有的東西都可以封裝在這個類中,在那裏產生的下載對象可以跟蹤下載的內容,解析的內容等等。如果你不使用異步的NSURLConnection(例如你只是使用dataWithContentsOfURL),它更容易,儘管你失去了一些NSURLConnection提供的和/或串流機會的進度更新。

  2. 爲獲得最佳性能,您應該執行併發請求。話雖如此,你不應該有超過四個或五個併發請求去任何特定的服務器。這是iOS限制,特別是如果您的網絡連接速度較慢,則可能會導致連接超時。

  3. 如果您在模擬器上進行初步測試,您可能需要確保嘗試使用「網絡鏈路調節器」。它是「Xcode的硬件IO工具」的一部分,可在Downloads for Apple Developers處獲得。有些問題(如上面提到的超時問題,如果你有太多的併發請求去某個特定的服務器)只能以慢速連接的方式表現出來。

  4. 話雖如此,您還想確保在具有真實世界網絡速度的設備上測試您的解決方案。在模擬器上成功地運行大量並行任務很容易,這對設備來說太貪心。將併發會話的數量限制爲五個會減少這個資源問題,但它應該成爲測試策略的一部分。

  5. 我同意JRG-Developer,你應該看看已建立的框架,如AFNetworking。不過,如果排隊100次加上操作,請確保將maxConcurrentOperationCount設置爲AFHTTPClientqueue

  6. 我不知道您的100個請求需要多少數據,但應預先通知應用程序審批流程拒絕在蜂窩網絡上發出非常網絡請求的應用程序。雖然Avoiding iPhone App Rejection From Apple聲稱你應該確保你在5分鐘內不超過4.5mb,但構成過度蜂窩網絡活動的因素並未在應用評估指南中明確說明。您可以使用Reachability來確定您所在的網絡類型,並可能在用戶使用蜂窩網絡時警告用戶(如果數據量接近此閾值)。

+0

非常好的答案 – 2015-12-31 12:26:10

3

您是否考慮過使用第三方框架(如AFNetworking),並且同時限制異步調用的數量?也許這可能有助於解決你的問題。

特別是,你可能會考慮創建一個networking manager類,創建和管理AFHTTPClient(s),進而管理AFHTTPRequestOperations,爲每個端點(基URL)你打。

+0

我對這裏所描述的有點新鮮,所以你有可能爲我補充最後一段嗎? – user212541 2013-03-24 17:00:16