【问题标题】:Cancel a request Alamofire取消请求 Alamofire
【发布时间】:2017-05-19 14:07:10
【问题描述】:

我正在发送一个基于计时器触发的请求。但是,如果我按下后退按钮,请求似乎仍然处于活动状态,并且响应依次使应用程序崩溃。请提出一种取消请求的方法。

使用 Xcode 8.2.1 斯威夫特 3

这是示例请求:

Alamofire.request(path!, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: createHeader()).responseJSON {
    response in
    switch response.result {
    case .success(let data):
        success(data as AnyObject?)
    case .failure(let error) :
        failure(error as NSError)
    }
}

甚至尝试使 viewDidDisappear 上的计时器无效,但无济于事。

谢谢!!

【问题讨论】:

标签: ios xcode swift3 http-post alamofire


【解决方案1】:

Alamofire 4 / Swift 3 / Xcode 8

您可以取消单个请求,如下所示:

1 - 首先获取请求:

let request = Alamofire.SessionManager.default.request(path!, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: createHeader()).responseJSON { response in
    switch response.result {
    case .success(let data):
        success(data as AnyObject?)
    case .failure(let error) :
        failure(error as NSError)
    }
}

2 - 然后,在您的 viewDidDisappear 中,调用:

request.cancel()


您可以取消所有请求,如下所示:

Alamofire.SessionManager.default.session.getTasksWithCompletionHandler { (sessionDataTask, uploadData, downloadData) in
    sessionDataTask.forEach { $0.cancel() }
    uploadData.forEach { $0.cancel() }
    downloadData.forEach { $0.cancel() }
}

【讨论】:

    【解决方案2】:

    你试过this解决方案吗:

    let sessionManager = Alamofire.SessionManager.default 
    sessionManager.session.getTasksWithCompletionHandler { dataTasks, uploadTasks, downloadTasks in 
    dataTasks.forEach { $0.cancel() } 
    uploadTasks.forEach { $0.cancel() } 
    downloadTasks.forEach { $0.cancel() } 
    }
    

    我还添加了一个检查来验证这是否是我要取消的请求:

    dataTasks.forEach
                {
                    if ($0.originalRequest?.url?.absoluteString == url)
                    {
                        $0.cancel()
                    }
                }
    

    【讨论】:

      【解决方案3】:

      SWIFT 5

      Alamofire.Session.default.session.getTasksWithCompletionHandler({ dataTasks, uploadTasks, downloadTasks in
                  dataTasks.forEach { $0.cancel() }
                  uploadTasks.forEach { $0.cancel() }
                  downloadTasks.forEach { $0.cancel() }
              })
      

      【讨论】:

        【解决方案4】:

        这个怎么样:

        manager.session.invalidateAndCancel()
        

        【讨论】:

          【解决方案5】:

          如果它对任何人有帮助,就我而言,我在 SessionManager 上有一个 RequestRetrier,它在取消后重试请求,所以一定要检查那里!

          【讨论】:

            猜你喜欢
            • 2018-12-16
            • 2016-12-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-04-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多