2017-07-21 90 views
2

我目前使用Moya來組織我的網絡呼叫。按照他們的docs,我已經配置如下所示:如何使用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確實允許取消討論here的請求。從最upvoted評論,有人提到let request_1 = MoyaRequestXXXXX然後ruest_1.cancel()

我的問題是:

  1. 我將如何繼續指向請求?
  2. 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 

我覺得我沒有得到語法正確,並且添加提供者而不是請求。但是,由於請求本身就是一個塊,那麼將在哪裏添加請求?

回答

3

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. 
+0

非常感謝您的建議。我在問題主體中添加了更多內容作爲響應 - 它與添加請求的語法有關。主要問題是塊語法 - 請求是塊,我不知道在我的'[Cancellable]'數組中添加請求的合適位置。 – daspianist

+0

查看編輯答案:) – kamwysoc

+1

啊完美。非常感謝! – daspianist