2012-04-07 245 views
4

現在我們已經在這個問題上敲了兩個星期了。任何幫助將不勝感激。異步NSURLConnection性能問題

問題:

我使用NSURLConnection的從問題的REST Web服務獲取JSON數據的要求是這樣的,我不能做數據的延遲加載。每次登錄用戶打開應用程序時,都需要在應用程序的第一個屏幕上處理一大塊數據。我知道這不是一件聰明的事情,但卻無法幫助它。高速緩存正在本地Sqlite數據庫中完成。我們正在使用Async NSURLConnection,它給我們持續3-4秒的性能提升。

我們嘗試了同步NSURLConnection,並發現異步NSURLConnection需要大約3-4秒的時間來處理相同的請求。但是,同步NSURLConnection根本不可靠,它無法獲得完整的JSON超過一半的時間。同步NSURLConnection與NSOperation的組合將無濟於事。

我們嘗試在單獨的應用程序中進行調用,只是爲了觀察該特定請求的性能,並且仍然得到相同的結果。

所以,目前我們獲得的完整請求的平均執行時間約爲6-8秒。我們覺得我相當高的應用程序的第一個屏幕。 (請讓我知道,如果它不多,感覺像不好的用戶體驗對我來說)。

問題:

是不是NSURLConnection的做這樣的要求的標準呢?

除了NSURLConnection之外,還有更好更快的(可靠的)嗎?

我可以優化NSURLConnection的性能嗎?如果是,請指向正確的方向。

有沒有人試過CFHTTPStream?如果是的話,那麼在性能方面比NSURLConenction更好嗎?

由於


@GoZoner由於一噸的響應。我們在下面的測試三種方式

  1. 因爲它是應用程序的第一個屏幕,所以應用程序沒有真正的情況下,其他人做任何事情,還是結果是不同的,一致的3-4秒損失與異步。

  2. 我們在一個單獨的測試應用程序中做了一個原始調用,除了只有一個web服務調用,並且結果仍然是相同的。

  3. 我們在設備上和模擬器上進行了測試。在設備上,如預期的那樣,結果更差,在Async NSURLConnection調用中大約持續4秒。

我們對可靠性問題也很驚訝,因爲Sync NSURLConnection是不可靠的。但是經過第十萬次運行測試之後,我們意識到它實際上並不可靠,不是因爲NSURLConnection庫中的某些東西,而是因爲3G或Wi-Fi連接不可靠,因此呼叫主要由於連接而斷開(我的假設)。Async NSURLConnection可以很好地處理這個問題,因爲它會一直調用和附加數據,直到數據接收完成爲止(這有時會花費10-12次以上的時間追加數據來完成JSON)。由於Sync NSURLConenction在獲取數據時只進行一次嘗試,因此在不可靠的移動網絡連接中失敗。

@Andrea謝謝你的迴應:)肯定會給YAJL一個旋轉。但我相信問題更多的是連接而不是解析JSON,我可能是錯的。 YAJL有一個可靠的連接處理機制嗎?

期待更多的答覆,您的建議和意見實際上是非常寶貴的:)

感謝

+0

您已經完成了同步和異步URL加載之間的一些時間測量。正如你所知道的,在異步請求期間,如果發生其他事情,那麼你預計它會變慢 - 你的測量是否與應用程序的其餘靜態相關?另外,這兩類請求具有不同的可靠性是非常不尋常的。從Apple文檔「同步加載構建在異步加載代碼的頂部......調用線程在異步加載系統執行URL加載時被阻止......」 – GoZoner 2012-04-07 16:22:51

+0

似乎JA的YAJL解析器也可以解析流......看看它。 – Andrea 2012-04-07 17:05:06

+0

謝謝你們。我的迴應有點大,以適應這裏,所以添加它作爲對我的問題的迴應。請看看和建議。 – 2012-04-08 08:51:08

回答

1

嘗試使用ASIHttpRequest響應時間可能比NSURLConnection的更快。

+0

謝謝噸Arundhati。我們實際上最終使用了ASIHttpRequest。我很快會在博客文章中強調很多重要的觀察結果。再次感謝:) – 2012-04-12 15:32:14

+0

ASIHttpRequest已被其開發者放棄,他建議尋找另一種解決方案。 AFNetworking似乎是一種流行的選擇。 – 2012-06-26 17:13:38