如何使用 Moya 取消多个网络请求
How to cancel multiple networking requests using Moya
我目前使用的是Moya to structure my networking calls. Per their 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()
我的问题是:
- 我如何保持指向请求的指针?
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
我想我的语法不正确,添加的是提供者而不是请求。但是,由于请求本身就是一个块,那么添加请求的地方在哪里呢?
request
方法returns一个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 设置了一个代理,它似乎按预期工作。未发送任何请求 - 每个请求都已取消。
那么,您问题的答案是:
- 您可以将其保存在
[Cancellable]
数组中。
- 遍历数组并取消您要取消的每个请求。
编辑
主要问题是您将提供程序添加到数组并尝试将 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.
我只想取消当前的提供商会话 + 任务:
provider.manager.session.invalidateAndCancel()
我目前使用的是Moya to structure my networking calls. Per their 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()
我的问题是:
- 我如何保持指向请求的指针?
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
我想我的语法不正确,添加的是提供者而不是请求。但是,由于请求本身就是一个块,那么添加请求的地方在哪里呢?
request
方法returns一个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 设置了一个代理,它似乎按预期工作。未发送任何请求 - 每个请求都已取消。
那么,您问题的答案是:
- 您可以将其保存在
[Cancellable]
数组中。 - 遍历数组并取消您要取消的每个请求。
编辑
主要问题是您将提供程序添加到数组并尝试将 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.
我只想取消当前的提供商会话 + 任务:
provider.manager.session.invalidateAndCancel()