返回 导航

Swift

hangge.com

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)

回到顶部