2015-06-12 35 views
1

目前還不清楚Alamofire是否支持大數據集或漸進式數據集的分塊數據。這是我的應用程序非常需要的功能,否則我可能需要研究其他方法。Alamofire支持分塊數據響應嗎?

Alamofire Github頁面上,它表示Progress Closure & NSProgress,但我不確定那是什麼意思。

並根據關於分塊數據傳輸的Wikipedia的描述。

Senders can begin transmitting dynamically-generated content before knowing the total size of that content.


爲了清楚起見,讓我解釋爲什麼我需要這個。

基本上我有一個非常大的JSON文件部分緩存。完整的JSON文件由較小的JSON對象組成。我正在使用iojs/nodejs通過res.write()Express發送分塊數據,它知道不發送Content-Length標題並將其作爲分塊數據發送。我已通過html/js驗證了此作品。


讓我知道你是否希望我提供代碼來證明這一點!

+0

你找到解決這個問題? – LaX

+0

不,對不起。我們只是使用Socket.io和一個自定義中間件來處理這個問題。 –

+1

好的,謝謝,看起來我需要使用HTTP/2來代替... – LaX

回答

1

Alamofire絕對支持Transfer-Encoding: chunked數據由於它已經被NSURLSession支持。這裏是一個從httpwatch.com下載分塊圖像的簡單例子。

let request = Alamofire.request(.GET, "http://www.httpwatch.com/httpgallery/chunked/chunkedimage.aspx") 
request.progress { bytesReceived, totalBytesReceived, totalBytesExpected in 
    println("\(bytesReceived) - \(totalBytesReceived) - \(totalBytesExpected)") 
} 
request.response { request, response, _, error in 
    println(request) 
    println(response) 
    println(error) 
} 

debugPrintln(request) 

由於圖像的內容長度不可用,則totalBytesExpected將始終被報告爲-1,因爲它是未知的。儘管如此,bytesReceivedtotalBytesReceived報告正常。在我看來,分塊下載可能不是嘗試向用戶呈現下載進度的最佳候選,因爲它的長度不確定。

可能使用的另一個可能的功能是請求上的新功能stream。它允許您在下載時存儲每個數據塊。

如果這些選項不能滿足您的所有需求,請在我們的Github項目中提出問題並解決您遇到的問題,以便我們進一步調查。

+2

這讓我想到了我正在尋找的答案,雖然不是我喜歡的答案。看起來好像數據在任何情況下成功關閉之後纔可用。我希望能夠處理JSON數據,因爲它正在以大塊的形式進行流式傳輸。這現在看起來不太可能。看起來我可能不得不實施另一種解決方案(可能是Socket.io) –

+0

您可以在Alamofire中執行此操作。正如我在我的回答中提到的,您應該查看'stream' [功能](https://github.com/Alamofire/Alamofire/blob/master/Source/Request.swift#L120-L135)。 – cnoon

+1

我確實看過,但它不適合我的要求。即使服務器將完整對象作爲分塊數據發送,對象偶爾也會變形。其他時候,事件從未解僱。 –

-1

以下可能幫助 -

https://github.com/Alamofire/Alamofire#downloading-a-file-wprogress

下載文件瓦特/進度

Alamofire.download(.GET, "http://httpbin.org/stream/100", destination: destination) 
     .progress { (bytesRead, totalBytesRead, totalBytesExpectedToRead) in 
      println(totalBytesRead) 
     } 
     .response { (request, response, _, error) in 
      println(response) 
     } 
+0

這並不能真正回答我的問題。首先,這是爲了下載文件 - 因此,進度關閉的原因只能爲您下載數據的數據大小提供指示。這不是一個閉包,其工作方式與分塊響應相同。 –

+0

看看這個也是:http://stackoverflow.com/questions/9296221/what-are-alternatives-to-nsurlconnection-for-chunked-transfer-encoding – Tushar

+0

是的。在發佈我的問題之前我看到了。理想情況下,我想在Alamofire中分塊數據,這樣我就不必爲自己的庫編碼。雖然,我開始認爲我可能不得不這樣做。或者,我可以將此作爲功能請求發送給作者。 –

1

來處理Alamofire分塊響應的正確方法是使用stream

let req = Alamofire.request("http://localhost:8080") 

    req.stream { (data) in 
     print(String(data: data, encoding: String.Encoding.utf8) ?? "No data") 
    }