Swift - 取消未完成的网络请求(使用Alamofire)
作者:hangge | 2018-10-10 08:10
有时对于一些界面,我们不希望它在离开后还继续进行网络请求。比如从一个页面进入到下一个页面,如果上一个页面还有未完成的网络请求的话,需要将其取消(继续请求也就没意义了)。如果项目中使用了 RxSwift 的话,这个功能就很好实现,具体参考我之前的这篇文章:
如果项目没用到 RxSwfit,只是单纯地使用 Alamofire 请求数据。这个功能也是可以做到的,下面通过样例进行演示。
1,取消指定的请求
(1)这种方式最简单,就是先将请求的 request 对象保存起来,之后调用它的 cancel() 方法即可将请求取消。
import UIKit import Alamofire class ViewController: UIViewController { //请求对象 var request:DataRequest? override func viewDidLoad() { super.viewDidLoad() } //发起请求 @IBAction func sendRequest(_ sender: Any) { print("开始发起请求...") self.request = Alamofire.request("http://www.hangge.com/code/test.php") .responseString { response in switch response.result { case .success(let data): print(data) case .failure(let error): print(error) } } } //取消请求 @IBAction func cancelRequest(_ sender: Any) { print("开始取消请求...") request?.cancel() } }
(2)我们首先发送一个请求,然后在请求还未响应时将其取消,控制台信息显示如下:
2,取消所有未完成的网络请求
如请求太多,将所有的 request 对象都保存下来再取消则略显麻烦。我们还可以通过 SessionManager 获取所有请求任务然后取消。
下面代码将所有未完成的数据请求、上传任务、下载任务都全部取消。
//取消所有请求 Alamofire.SessionManager.default.session.getTasksWithCompletionHandler { (sessionDataTask, uploadData, downloadData) in sessionDataTask.forEach { $0.cancel() } uploadData.forEach { $0.cancel() } downloadData.forEach { $0.cancel() } }
3,取消指定 url 的请求
这种方式同上面一样,只不过增加个 url 判断。只取消指定 url 的数据请求。
Alamofire.SessionManager.default.session.getTasksWithCompletionHandler { (sessionDataTask, uploadData, downloadData) in sessionDataTask.forEach { //只取消指定url的请求 let url = "http://www.hangge.com/code/test.php" if ($0.originalRequest?.url?.absoluteString == url) { $0.cancel() } } }
全部评论(0)