Alamofire 是否支持分块数据响应?

Does Alamofire support chunked data response?

目前尚不清楚 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 objects 组成。我正在使用 iojs / nodejs 通过 res.write()Express 发送分块数据,它知道不发送 Content-Length header 并发送它作为分块数据。我已经通过 html/js.

验证了这项工作


如果您想让我提供代码来演示这一点,请告诉我!

以下内容可能会有所帮助 -

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

正在下载文件w/Progress

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

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 项目中提交您 运行 遇到的问题,以便我们进一步调查。

在 Alamofire 中处理分块响应的正确方法是使用 stream

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

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