取消请求Alamofire

时间:2017-01-05 05:53:09

标签: ios xcode swift3 http-post alamofire

我发送的是基于计时器触发的请求。但是,如果我按下后退按钮,请求似乎仍然处于活动状态,而响应又会导致应用程序崩溃。请建议取消请求的方法。

使用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上使计时器无效,但没有帮助。

谢谢!

5 个答案:

答案 0 :(得分:32)

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() }
}

答案 1 :(得分:8)

你试过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()
                }
            }

答案 2 :(得分:2)

SWIFT 5

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

答案 3 :(得分:0)

如何?

manager.session.invalidateAndCancel()

答案 4 :(得分:0)

万一它对任何人都有帮助,就我而言,我在SessionManager上有一个RequestRetrier,它在取消请求后重试了该请求,因此请务必在此处检查!