我目前正在使用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()
我的问题是:
provider
没有cancel()
功能 - 所以我应该怎么称呼它?非常感谢任何帮助。
修改
根据有关使用[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
我认为我的语法不正确,并且正在添加提供程序而不是请求。但是,由于请求本身就是一个块,哪里可以添加请求?
答案 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设置代理,它似乎按预期工作。没有发送请求 - 每个请求都被取消。
所以,你的问题的答案是:
[Cancellable]
数组中。修改强>
主要问题是您将提供程序添加到数组中并尝试将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()