2013-03-26 28 views
-1

在我的應用程序中,我想通過JSON下載大量的blob。我的應用程序應該離線工作,我有一個同步選項可以在登錄到應用程序時從JSOM服務下載詳細信息,例如任務類型,任務ID以及更多以及blob。 我的問題是,我的應用程序在同步下載100Mb的blob時會崩潰,建議我以某種方式做到這一點,我的應用程序不會崩潰。iPhone-從JSON Web服務下載大量blob的問題

回答

0

您應該異步下載數據。如果主線程被阻塞一段時間,您的應用程序將被終止。而且,無響應的UI會給用戶帶來不好的體驗。

有關更多詳細信息,請參閱此Technical Q&A

+0

感謝Attila H,您的鏈接非常有效。 – Logunath 2013-03-27 06:52:24

1

如果你崩潰,可能的罪犯或者是:

  1. 你在同步過程中的前臺運行這一點,它的時間太長,而iOS是殺害你的應用程序;或

  2. 您的內存不足。

使用異步下載過程將解決第一個問題,但在我看來,關鍵的問題是JSON是否是正確的接口都爲這個數據量(或者,就此而言,這種類型的數據)。 JSON庫通常需要一個feed並將其加載到NSArrayNSDictionary中。但是,在處理這麼大的事情時,這不是一個明智的做法,而且您可以通過設備上最有限的資源之一快速吃掉內存。一般來說,你更喜歡一些流媒體界面,減少你的應用程序的足跡,並防止與內存相關的問題,直接將數據寫入持久存儲,因爲它收到。 (當然,你會這樣做異步,所以該應用程序不會阻止主隊列,並迫使iOS殺死你的應用程序。)

所以,底線,我會問你是如何結婚的JSON界面。我可能傾向於直接下載blob的URL。也許你有一個控制過程的JSON,例如識別該URL是什麼,一些識別信息,例如應用程序可以用來確定是否需要下載的版本號或時間戳等。但是JSON通常不適用於下載大塊。

理論上你可以使用JSON的表兄弟XML進行流式傳輸。但NSXMLParser有關於流媒體的自己的挑戰,我已經結束了回落到LibXML2。底線,儘管XML比關於流式傳輸的JSON要好,但我仍然傾向於單獨的URL,您可以直接下載blob,並且只使用JSON(或XML)作爲控制流程。

一旦你有了一個用於直接下載blob的URL,那麼你可以使用下載機制,允許你在收到數據時將數據寫入永久存儲器,而不僅僅是將它附加到你要的某個數據結構中保存在RAM中(例如,如果使用NSURLConnection,則有一個didReceiveData,它將接收到的數據寫入永久存儲器,而不是典型的,頭腦簡單的實現,只是將數據附加到NSMutableData)。

在一個不相關的問題上,應該預先告知,如果這個應用程序是針對商店的,那麼Apple會拒絕通過蜂窩網絡做出過多請求的應用程序。您可能想要檢測連接類型(例如,通過Reachability),並警告用戶是否處於蜂窩連接。

+0

感謝羅布,你的文章對我的應用程序更有用。 – Logunath 2013-03-27 06:51:34

+0

@Rob +1對於你在這個答案的努力。 – 2013-07-25 14:51:57