我正在尝试下载文件,我想使用NetworkReachabilityManager
来检测何时失去连接,如下所示:
self.reachabilityManager?.listener = { status in
print("Status: \(status)")
if status == .NotReachable {
self.download?.suspend()
}
else if status == .Reachable(.EthernetOrWiFi) {
self.download?.resume()
}
self.reachabilityManager?.startListening()
最初,我像这样开始下载:
self.download = self.manager.download(.GET, url) { (temporaryURL, response) -> NSURL in
return NSURL(string: fullFilename)!
}
.progress { (bytesRead, totalBytesRead, totalBytesExpectedToRead) in
self.setProgress(totalBytesRead, totalBytesExpectedToRead: totalBytesExpectedToRead)
}
.response { (request, response, data, error) in
self.handleDownloadResponse(fullFilename, response: response, data: data, error: error)
}
当我关闭网络时,我会认为
self.download?.suspend()
会暂停下载请求,然后self.download?.resume()
会重新开始下载,但是从未调用进度处理程序,并且过了一段时间后响应处理程序启动了超时错误我应该这样做吗?如何实现此行为(在恢复网络后恢复下载)?
最佳答案
您需要对此逻辑进行很多更改,以使事情按预期工作。您可以按照以下步骤将自己带到想要的地方。
当您在进行中的请求失去连接时,您的response
闭包将被调用,并且error
将指示连接问题。
在response
闭包中,如果data
参数不是nil
,则它是下载请求的resumeData
,可用于从上次中断的地方继续下载。
如果data
参数是nil
,则由于无法恢复下载,您需要重新启动下载。
在连接性关闭中,您只需要检查isReachable
或isReachableOnEthernetOrWiFi
参数。
在可达性检查中,如果需要,需要使用resumeData
发出新的下载请求,如果没有,则需要使用全新的请求。
一旦调用response
闭包,就无法再次运行相同的下载请求。
我没有尝试按照您的方式在下载请求上使用suspend
和resume
。文档似乎确实暗示可以使用suspend
和resume
来完成您的工作,但是通常的做法是取消请求,然后使用简历数据创建一个新请求。在请求失败之前,您还必须这样做,我认为这是不可能的。
我猜想在调用可达性关闭时您的请求已经失败了。
希望这有助于您走上正确的道路。有关这些步骤的更多信息,请参考URL Loading System文档以及Alamofire README。
关于ios - Alamofire履历未按预期工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39277943/