2016-07-14 5 views
0

アラモファイアマルチタスクを使用する1つのファンクション後に実行。 私の使用gcd、NSOperationQueueすべての障害。 マスターを解決するのを手伝ってください。アラモファイアマルチタスク1つのファンクション後に実行

次の擬似コード:

let imgDatas1 = UIImageJPEGRepresentation(UIImage(named: "aar")!, 0.1) 
let strUrl1 = "http://www.baidu.com" 


    let group = dispatch_group_create() 
    let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 
    //let queue = dispatch_get_main_queue() 

    dispatch_group_async(group, queue) { 
     print("threed 1.1") 
     Alamofire.upload(.POST, strUrl1, data: imgDatas1!).responseString(completionHandler: { (dd) in 
      NSThread.sleepForTimeInterval(3.0) 
      print("threed1.3") 
     }) 
     print("threed1.2") 
    } 
    dispatch_group_async(group, queue) { 
     print("threed2.1") 
     Alamofire.upload(.POST, strUrl1, data: imgDatas1!).responseString(completionHandler: { (dd) in 
      NSThread.sleepForTimeInterval(2.0) 
      print("threed2.3") 
     }) 

     print("threed2.2") 
    } 

    dispatch_group_notify(group, queue) { 
     print("voer") 
    } 





    let operationQueue = NSOperationQueue() 
    let operation1 = NSBlockOperation { 
     Alamofire.upload(.POST, strUrl1, data: imgDatas1!).responseString(completionHandler: { (dd) in 
      NSThread.sleepForTimeInterval(2.0) 
      print("xian 1.2") 
     }) 
     print("xian 1.1") 

    } 
    let operation2 = NSBlockOperation { 
     Alamofire.upload(.POST, strUrl1, data: imgDatas1!).responseString(completionHandler: { (dd) in 
      NSThread.sleepForTimeInterval(3.0) 
      print("xian 2.2") 
     }) 
     print("xian 2.1") 
    } 
    let operation3 = NSBlockOperation { 
     print("xian 3") 
    } 
    operation2.addDependency(operation1) 
    operation3.addDependency(operation2) 

    operationQueue.addOperation(operation1) 
    operationQueue.addOperation(operation2) 
    operationQueue.addOperation(operation3) 

答えて

0

これらのアプローチの両方の問題点は、要求の実際の応答を要求の発行を同期ではなく、していることです。あなたのGCDの例では、応答がまだ受信されていないのに、要求が発行されるとすぐにあなたのdispatch_group_asyncを終了します。同様に、操作キューの例では、要求が発行されるとすぐにブロック操作を完了しますが、これらの操作は要求の完了を待っていません。

単純な、面白そうでない場合のアプローチは、前のハンドラの完了ハンドラでただ1つを呼び出すことです。それらを別々の関数に置くと、補完ハンドラの不揃いなネストが回避されます。

あなたはよりエレガントな解決策を探しているなら、あなたは非同期 NSOperation/ Operationサブクラスでこれをラップすることにより、操作キューでこれを解決し、要求が行われたときにのみ isFinished KVOを誘発します。 非同期操作と同期操作セクションの Operation Referenceを参照するか、 同時処理プログラミングガイドのOperation Queues: Concurrent Versus Non-concurrent Operationsの若干詳細な(ただし日付のついた)説明を参照してください。

もう1つの優雅なアプローチは、PromiseKitのような約束を使用することです。それはかなり劇的な解決策(完全に新しい非同期パターンを導入する)として私を襲いますが、この種の問題をうまく解決します。

関連する問題