Alamofire恢复未按预期工作

时间:2016-09-01 17:49:53

标签: ios alamofire

我正在尝试下载文件,我想检测它何时使用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()将重新启动下载,但进程处理程序永远不会被调用,过了一会儿响应处理程序以超时错误

启动

我应该这样做吗?如何实现此行为(在恢复网络时恢复下载)?

1 个答案:

答案 0 :(得分:1)

您需要对此逻辑进行相当多的更改才能使事情按预期工作。以下是一系列步骤,可以帮助您达到目的。

  1. 当您在运行中失去与请求的连接时,系统会调用response关闭,error将指示连接问题。
  2. response关闭中,如果data参数不是nil,则它是下载请求的resumeData,可用于从哪里恢复下载它停了下来。
  3. 如果data参数为nil,则您需要重新启动下载,因为无法恢复。
  4. 在连接关闭中,您只需要检查isReachableisReachableOnEthernetOrWiFi参数。
  5. 在可访问性检查中,您需要使用resumeData进行新的下载请求(如果有),如果不这样做,则需要一个全新的请求。
  6.   

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

    我没有尝试按照您的方式对下载请求使用suspendresume。文档似乎暗示可以使用suspendresume来执行您正在执行的操作,但通常的做法是取消请求,然后使用恢复数据创建一个新请求。在请求失败之前你还必须这样做,我认为这是不可能的。

      

    我猜你的请求在调用可达性闭包时已经失败了。

    希望这有助于您走上正轨。有关上述任何步骤的详细信息,请参阅URL Loading System文档以及Alamofire README