2012-03-21 30 views
3

[NSData dataWithContentsOfURL:url]返回成功的全部字節數,或nil如果出現問題?iOS - [NSData dataWithContentsOfURL:url]是否可能僅返回內容的一部分字節?

有沒有機會,它會返回可能只有一半的字節的內容...也許如果他們的互聯網連接中途通過?

如果有機會它只會返回部分數據,是否有一些其他功能我可以使用它會更可靠,我將能夠明確地知道他們是否得到了全部數據量?

回答

6

我不確定-dataWithContentsOfURL的實現:但是使用像這樣的同步方法並不是真的推薦。

基於NSURLConnection的東西是你最好的選擇,但你需要注意一些事情。大多數人沒有意識到,如果服務器在NSURLConnection接收數據時斷開連接,它不會導致下載失敗並出現錯誤。 -connectionDidFinishLoading:委託方法將被視爲正常。許多人得到這個錯誤。

如果你想確保你有所有的數據,你需要處理-connection:didReceiveResponse:委託方法並保存[response expectedContentLength]的值。然後在-connectionDidFinishLoading:中,您可以確保您收到了與預期相同的字節數,如果沒有,則會生成錯誤。

有許多免費圖書館在那裏基於NSURLConnectionAFNetworking。但是,您需要注意錯誤的代碼。我剛剛檢查了源代碼到AFNetworking,看起來他們也沒有檢查服務器發回的數據少於Content-Length標題指定的數據。另外請注意,受歡迎的ASIHTTPRequest不再被積極開發,並且在實施中受到一些批評。

我會把它留給其他人來建議其他替代庫,但NSURLConnection是正確的方向。

+0

如果在後臺線程上使用同步請求,那麼可以使用同步請求嗎?我已經爲這項工作設置了一個後臺線程設置,除了一些其他的東西,如果我可以使用'[NSUrlConnection sendSynchronousRequest:returningResponse:error:]',我的代碼更容易。用這種方法,我仍然可以得到響應對象,然後調用[response expectedContentLength]。 – Kyle 2012-03-21 16:18:56

+0

從技術上說,同步調用除了創建另一個線程之外,還會創建另一個線程。同步方法僅僅是NSURLConnection的一個輕量級包裝器,它將旋轉後臺線程並阻塞。有一個WWDC視頻談到這個,但我現在不記得標題。 – 2012-03-21 16:26:33

1

如果你'擔心這樣的事情,我建議使用NSURLConnection與它的適當的代表。

異步方法(即NSURLConnection)總是更好。

相關問題