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

标签 ios swift networking alamofire moya

我目前正在使用 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) 在我的应用程序名为 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 

我想我的语法不正确,添加的是提供者而不是请求。但是,由于请求本身就是一个 block ,那么添加请求的地方在哪里呢?

最佳答案

request 方法返回一个 Cancellable .从文档中我们可以读到:

The request() method returns a Cancellable, which has only one public function, cancel(), which you can use to cancel the request.

所以根据这个,我做了一个简单的测试调用:

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,从而导致错误。 您应该将请求添加到数组中。您可以在下面看到实现。

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.

关于ios - 如何使用 Moya 取消多个网络请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45227169/

相关文章:

ios - 如何使用泛型 `Results` 声明可选类属性

swift - 如何避免 Mojave 上的 Safari 扩展崩溃?

ios - Swift - 试图获取当前位置

ios - 在后台任务中添加到 CALayer 时不显示 UIImage

c - 手动完成 3 次握手?

linux - Linux本地网络文件同步

iphone - uilabel 边框在旋转后变形

jquery - $(window).width() 在缩放后不会更新(chrome IOS)

python - 在 Python 中打开套接字的最佳方法

ios - Oauth1 iOS 从 API 获取数据