9

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

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 确实允许从此处的讨论中取消请求。从最受好评的评论中,有人提到let request_1 = MoyaRequestXXXXX然后ruest_1.cancel()

我的问题是:

  1. 我将如何保持指向请求的指针?
  2. provider没有cancel()功能 - 那么我应该如何调用它?

任何帮助深表感谢。

编辑:

根据有关 using 的有用建议[Cancellable],我执行了以下操作:

(1) 在我的应用程序的单例实例Operator中,我添加了var requests = [Cancellable]() (2) 每个 API 调用都作为可取消添加到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 

我认为我的语法不正确,并且正在添加提供程序而不是请求。但是,既然请求本身就是一个块,那么添加请求的地方在哪里呢?

4

2 回答 2

15

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. 遍历数组并取消您要取消的每个请求。

编辑

主要问题是您将提供程序添加到数组中并尝试将其映射providerCancellable,从而导致错误。您应该将请求添加到数组中。下面你可以看到实现。

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.
于 2017-07-21T06:32:14.750 回答
1

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

provider.manager.session.invalidateAndCancel()
于 2019-02-28T08:32:20.033 回答