2016-07-28 108 views
1

我有很多請求女巫我想不斷地調用一個沒有嵌套意大利麪代碼的請求。Alamofire一個接一個的請求數

我有一個串行調度隊列

let queue = dispatch_queue_create("label", DISPATCH_QUEUE_SERIAL) 

Alamofire.request(Router.Countries).responseString { (response:Response<String, NSError>) in 
      print(1) 
     } 

Alamofire.request(Router.Countries).responseString { (response:Response<String, NSError>) in 
      print(2) 
     } 

Alamofire.request(Router.Countries).responseString { (response:Response<String, NSError>) in 
      print(3) 
     } 

試過了,不過遺憾的是不工作。其輸出可以是1,3,2或3,1,2或其他任何組合。

什麼是最好的方法來獲得輸出1,2,3一個接一個。

+0

你有幾次嘗試,或者你已經知道你會有多少次要求? – Miknash

+0

我知道有多少病態,但當然這將是更好的動態 – Eike

+0

你試過使用'dispatch_semaphore'?我沒有時間回答一個很好的答案,但你可以在這裏找到很多例子。SO –

回答

3

好吧,我寫了我自己的實現。

我創建了一個類RequestChain至極需要Alamofire.Request作爲參數

class RequestChain { 
    typealias CompletionHandler = (success:Bool, errorResult:ErrorResult?) -> Void 

    struct ErrorResult { 
     let request:Request? 
     let error:ErrorType? 
    } 

    private var requests:[Request] = [] 

    init(requests:[Request]) { 
     self.requests = requests 
    } 

    func start(completionHandler:CompletionHandler) { 
     if let request = requests.first { 
      request.response(completionHandler: { (_, _, _, error) in 
       if error != nil { 
        completionHandler(success: false, errorResult: ErrorResult(request: request, error: error)) 
        return 
       } 
       self.requests.removeFirst() 
       self.start(completionHandler) 
      }) 
      request.resume() 
     }else { 
      completionHandler(success: true, errorResult: nil) 
      return 
     } 

    } 
} 

我用它這樣

let r1 = Alamofire.request(Router.Countries).responseArray(keyPath: "endpoints") { (response: Response<[CountryModel],NSError>) in 
    print("1") 
} 

let r2 = Alamofire.request(Router.Countries).responseArray(keyPath: "endpoints") { (response: Response<[CountryModel],NSError>) in 
    print("2") 
} 

let r3 = Alamofire.request(Router.Countries).responseArray(keyPath: "endpoints") { (response: Response<[CountryModel],NSError>) in 
    print("3") 
} 

let chain = RequestChain(requests: [r1,r2,r3]) 

chain.start { (success, errorResult) in 
    if success { 
     print("all have been success") 
    }else { 
     print("failed with error \(errorResult?.error) for request \(errorResult?.request)") 
    } 


} 

Importent是你告訴經理不立即執行請求

let manager = Manager.sharedInstance 
    manager.startRequestsImmediately = false 

希望它能幫助別人se

-1

一種解決方法是調用中的第一個回調您的第二個請求:

Alamofire.request(Router.Countries).responseString { (response:Response<String, NSError>) in 
      print(1) 
      Alamofire.request(Router.Countries).responseString { (response:Response<String, NSError>) in 
       print(2) 
       Alamofire.request(Router.Countries).responseString { (response:Response<String, NSError>) in 
         print(3) 
       } 
      } 
     } 
0

我使用Artman's Signals通知我的應用程序,一旦返回的結果,在這之後,隊列的其他地方可以調用它的下一個請求:

Alamofire.request(httpMethod, url, parameters: params).responseJSON 
{ 
    (response: Response< AnyObject, NSError >) in 

    self._signals.dispatchSignalFor(Key: url, data: response.result) 
} 

更多詳情here

+0

有趣的方法!感謝這次打擊,但它不適合我的代碼庫。謝謝 – Eike