如何使用Moya取消多个网络请求

问题描述 投票:2回答:2

我目前正在使用Moya来构建我的网络呼叫。根据他们的docs,我将其配置如下:

enum SomeAPIService {
    case endPoint1(with: Object)
    case endPoint2(duration: Int)
}

在调用端点(在本例中为endPoint1)时,我会执行以下操作:

let provider = MoyaProvider<SomeAPIService>()
provider.request(.endPoint1(object: object)) { (result) in
switch result {
    case let .success(moyaResponse):
        finished(Result.success(value: moyaResponse.value))
    case let .failure(error):
        let backendError = BackendError(localizedTitle: "", localizedDescription: "Some error", code: moyaResponse.statusCode)
        finished(Result.failure(error: backendError))
    }
})

我的目标是,在用户执行操作时,取消正在发生的所有网络请求。

因此,Moya允许一个人取消讨论here的请求。从最受欢迎的评论中,有人提到let request_1 = MoyaRequestXXXXX然后ruest_1.cancel()

我的问题是:

  1. 我如何保持指向请求的指针?
  2. provider没有cancel()功能 - 所以我应该怎么称呼它?

任何帮助深表感谢。

编辑:

根据有关使用[Cancellable]的有用建议,我做了以下内容:

(1)在我的app的单例实例Operator中,我添加了var requests = [Cancellable]()(2)每个API调用都作为Cancellable添加到requests数组中,如下所示:

let provider = MoyaProvider<SomeAPIService>()
Operator.shared.requests.append(provider as! Cancellable) //causing error
provider.request(.endPoint1(object: object)) { (result) in
//rest of the block omitted 

我想我的语法不正确,并且正在添加提供程序而不是请求。但是,由于请求本身就是一个块,哪里可以添加请求?

ios swift networking alamofire moya
2个回答
6
投票

request方法返回Cancellable。从文档我们可以读到:

request()方法返回一个Cancellable,它只有一个公共函数cancel(),可用于取消请求。

所以根据这个,我做了一个简单的测试并致电:

var requests: [Cancellable] = []
@objc 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()
}

我使用Charles设置代理,它似乎按预期工作。没有发送请求 - 每个请求都被取消。

那么,你的问题的答案是:

  1. 你可以把它保存在[Cancellable]阵列中。
  2. 浏览数组并取消要取消的每个请求。

编辑

主要问题是您将提供程序添加到数组,并尝试将provider映射为Cancellable,以便导致错误。您应该向数组添加reqest。下面你可以看到实现。

let provider = MoyaProvider<SomeAPIService>()
let request = provider.request(.endPoint1(object: object)) { // block body }
Operator.shared.requests.append(request)
//Then you can cancell your all requests.

1
投票

我只想取消当前的提供者会话+任务:

provider.manager.session.invalidateAndCancel()
© www.soinside.com 2019 - 2024. All rights reserved.