正在 Swift 中部分下载数据
Partially downloading data in Swift
我正在尝试在 Swift 中开发下载加速器。它应该获取文件的大小并将其划分为 n
部分。然后它应该通过 运行 多个线程一次下载它们,然后合并这些部分。
我读了 C# - Creating a Download Accelerator,不幸的是它对我没有帮助。
我可以通过
轻松完成多线程部分
DispatchQueue.main.async {
// The new thread
}
但另一部分更难。我通常下载这样的文件:
try Data(contentsOf: URL(string: assetsUrl!)!)
或者我可以做
中解释的事情
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 - 它非常简单并且不接受很多参数。如何让它从服务器获取 "first 200_000 bytes"?
首先,服务器需要实现HTTP范围请求。如果没有,并且您不控制服务器,那么您将无法执行此操作。
如果服务器支持 HTTP 范围请求,那么您需要使用请求 headers 指定范围,如下所述:https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests
要领是先发送一个HEAD请求,判断服务器是否支持HTTP范围请求。这取决于响应是否包含具有 non-zero 值的 Accept-Ranges header。
如果服务器支持 HTTP 范围请求,那么您可以请求资源,例如将范围 header 设置为 bytes=0-1023 的值(取决于 Accept-Ranges header 指定,在本例中为 bytes)
我正在尝试在 Swift 中开发下载加速器。它应该获取文件的大小并将其划分为 n
部分。然后它应该通过 运行 多个线程一次下载它们,然后合并这些部分。
我读了 C# - Creating a Download Accelerator,不幸的是它对我没有帮助。
我可以通过
轻松完成多线程部分DispatchQueue.main.async {
// The new thread
}
但另一部分更难。我通常下载这样的文件:
try Data(contentsOf: URL(string: assetsUrl!)!)
或者我可以做
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 - 它非常简单并且不接受很多参数。如何让它从服务器获取 "first 200_000 bytes"?
首先,服务器需要实现HTTP范围请求。如果没有,并且您不控制服务器,那么您将无法执行此操作。
如果服务器支持 HTTP 范围请求,那么您需要使用请求 headers 指定范围,如下所述:https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests
要领是先发送一个HEAD请求,判断服务器是否支持HTTP范围请求。这取决于响应是否包含具有 non-zero 值的 Accept-Ranges header。
如果服务器支持 HTTP 范围请求,那么您可以请求资源,例如将范围 header 设置为 bytes=0-1023 的值(取决于 Accept-Ranges header 指定,在本例中为 bytes)