Alamofire+Moya+Rxswift如何取消网络请求

2,430 阅读1分钟

Alamofire的接口如何取消

看下面的例子

//MARK:-网络请求管理
static fileprivate var requestCacheArr = [DataRequest]();
//MARK:-发起网络请求
let dataRequest = SessionManager.default.request("").responseJSON { (responseJSON) in
    //移除已经完成的网络请求
    self.removeTask(task: responseJSON.request!);
}
//记录网络请求
self.requestCacheArr.append(dataRequest);

for task in self.requestCacheArr{
    task.cancel();
}
self.requestCacheArr.removeAll();

Alamofire+Moya后,如何取消接口请求

var requests: [Cancellable] = []
func doRequests() {
    for i in 1...20 {
        let request = provider.request(MyApi.someMethod) {
            result in
            print(result)
        }
        requests.append(request)
    }
    requests.forEach { cancellable in cancellable.cancel() } 
    // here I go through the array and cancell each request.
    requests.removeAll()
}

Alamofire+Moya+Rxswift如何取消网络请求

取消所有接口
func cancelAllRequest() {
    apiProvider.manager.session.getTasksWithCompletionHandler {
        (sessionDataTask, uploadData, downloadData) in
        sessionDataTask.forEach { $0.cancel() }
        uploadData.forEach { $0.cancel() }
        downloadData.forEach { $0.cancel() }
    }
}
取消对应的url接口
func cancelAllRequest(_ url: String) {
    apiProvider.manager.session.getTasksWithCompletionHandler {
        (sessionDataTask, uploadData, downloadData) in
        sessionDataTask.forEach {
            //只取消指定url的请求
            if ($0.originalRequest?.url?.absoluteString == url) {
                $0.cancel()
            }
        }
    }
}

使用Rxswift后,还有一个更好的控制取消的是DisposeBag

DisposeBag如同名字,是一个Bag类型的数据结构,里面存放Disposable的数据。

每次看到Disposable类型调用disposed(by: disposeBag),实际上是将Disposable放在DisposeBag中进行管理,当DisposeBag进行dispose时,对其中管理的Disposable分别dispose,可是DisposeBag不能主动调用,只能在deinit时自动释放,因此想要进行dispose操做,只能将disposeBag从新赋值,好比:

disposeBag = DisposeBag()

所以接口的生命周期是由disposeBag控制,把disposeBag定义在controller里面,当controller销毁时,那么他里面的接口也全部取消