2016-07-28 2 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を順番に取得するにはどうすればよいでしょうか。

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

あなたはn回の試行をしていますか? – Miknash

+0

私はいくつの病気があるのか​​知っていますが、もちろん動的である方が良いでしょう。 – Eike

+0

'dispatch_semaphore'を使ってみましたか?私は実際には良い答えで返信する時間はありませんが、ここでたくさんの例が見つかります。 –

答えて

3

私は自分自身の実装を書き終えました。

は、私はあなたがすぐに

を要求を実行しないようにマネージャーを言っているということであるクラス RequestChainウィッヒは、パラメータ

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 
     } 

    } 
} 

としてAlamofire.Requestを取り、私はこの

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)") 
    } 


} 

にとって必須のようにそれを使用して作成しました

let manager = Manager.sharedInstance 
    manager.startRequestsImmediately = false 

se

-1

一つの解決策は、最初の1のコールバックであなたの第2の要求を呼び出すことです:

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

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

詳細here

0

が、私は一度、結果が返された私のアプリに通知するArtman's Signalsを使用しています、キューが他の場所でそれを呼び出すことができた後に次のリクエストです:

+0

興味深いアプローチ!このヒットのためにありがとうが、私のコードベースに収まりません。どうも – Eike

関連する問題