在 Swift 中部分下载数据

Posted

技术标签:

【中文标题】在 Swift 中部分下载数据【英文标题】:Partially downloading data in Swift 【发布时间】:2017-09-07 15:04:10 【问题描述】:

我正在尝试在 Swift 中开发下载加速器。它应该获取文件的大小并将其划分为n 部分。然后它应该通过运行多个线程一次下载它们,然后合并部分。

我读了C# - Creating a Download Accelerator,不幸的是它对我没有帮助。

我可以通过

轻松完成多线程部分
DispatchQueue.main.async 
    // The new thread

但另一部分更难。我通常会下载这样的文件:

try Data(contentsOf: URL(string: assetsUrl!)!)

或者我可以做this answer中解释的事情

class Downloader 
    class func load(url: URL, to localUrl: URL, completion: @escaping () -> ()) 
        let sessionConfig = URLSessionConfiguration.default
        let session = URLSession(configuration: sessionConfig)
        let request = try! URLRequest(url: url, method: .get)

        let task = session.downloadTask(with: request)  (tempLocalUrl, response, error) in
            if let tempLocalUrl = tempLocalUrl, error == nil 
                // Success
                if let statusCode = (response as? HTTPURLResponse)?.statusCode 
                    print("Success: \(statusCode)")
                

                do 
                    try FileManager.default.copyItem(at: tempLocalUrl, to: localUrl)
                    completion()
                 catch (let writeError) 
                    print("error writing file \(localUrl) : \(writeError)")
                

             else 
                print("Failure: %@", error?.localizedDescription);
            
        
        task.resume()
    

但这不是 C - 它非常简单并且不接受很多参数。如何让它从服务器获取“前 200_000 个字节”?

【问题讨论】:

【参考方案1】:

首先,服务器需要实现HTTP范围请求。如果没有,并且您不控制服务器,那么您将无法执行此操作。

如果服务器支持 HTTP 范围请求,那么您需要使用请求标头指定范围,如下所述:https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests

关键是你首先发送一个 HEAD 请求来确定服务器是否支持 HTTP 范围请求。这取决于响应是否包含具有非零值的 Accept-Ranges 标头。

如果服务器支持 HTTP 范围请求,那么您可以对资源发出请求,将 Range 标头设置为例如 bytes=0-1023 的值(取决于指定的 Accept-Ranges 标头的格式,在此大小写字节)

【讨论】:

我怎样才能用 Swift 做到这一点? > 如果服务器支持 HTTP 范围请求,那么您可以对资源进行请求,将 Range 标头设置为例如字节=0-1023 的值 使用 request.setValue("bytes=0-1023", forHTTPHeaderField: "Range")。有关文档,请参阅developer.apple.com/documentation/foundation/urlrequest

以上是关于在 Swift 中部分下载数据的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中使用 Core Data 在表格视图的部分中显示数据

在 Swift 的表格视图中按字母部分显示来自 JSON 的数据

如何在 Swift 的一个部分中删除行中的用户默认数据?

如何设置下载数据的时间限制(来自json数据库)Swift 2

使用swift3在tableview中搜索栏和部分

Swift - 按部分对核心数据进行排序