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

时间:2017-07-21 00:32:15

标签: ios swift networking alamofire moya

我目前正在使用Moya来构建我的网络电话。根据{{​​3}},我将其配置如下:

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允许一个人取消讨论docs的请求。从最受欢迎的评论中,有人提到let request_1 = MoyaRequestXXXXX然后ruest_1.cancel()

我的问题是:

  1. 我如何保留指向请求的指针?
  2. provider没有cancel()功能 - 所以我应该怎么称呼它?
  3. 非常感谢任何帮助。

    修改

    根据有关使用[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 
    

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

2 个答案:

答案 0 :(得分:5)

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. 浏览数组并取消您要取消的每个请求。
  3. 修改

    主要问题是您将提供程序添加到数组中并尝试将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 :(得分:1)

我只是取消当前的提供方会话和任务:

provider.manager.session.invalidateAndCancel()