我正在尝试下载文件,我想使用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,则由于无法恢复下载,您需要重新启动下载。
在连接性关闭中,您只需要检查isReachableisReachableOnEthernetOrWiFi参数。
在可达性检查中,如果需要,需要使用resumeData发出新的下载请求,如果没有,则需要使用全新的请求。



  一旦调用response闭包,就无法再次运行相同的下载请求。


我没有尝试按照您的方式在下载请求上使用suspendresume。文档似乎确实暗示可以使用suspendresume来完成您的工作,但是通常的做法是取消请求,然后使用简历数据创建一个新请求。在请求失败之前,您还必须这样做,我认为这是不可能的。


  我猜想在调用可达性关闭时您的请求已经失败了。


希望这有助于您走上正确的道路。有关这些步骤的更多信息,请参考URL Loading System文档以及Alamofire README

关于ios - Alamofire履历未按预期工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39277943/

10-09 02:17