2016-07-14 5 views
0

Alamofire Multitask verwenden Ausführung nach einer Funktion. meine Verwendung gcd, NSOperationQueue alle Fehler. Bitte helfen Sie mir, den Meister zu lösen.Alamofire Multitask Ausführung nach einer Funktion

Der folgende Pseudocode:

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) 

Antwort

0

Das Problem mit diesen beiden Ansätzen ist, dass Sie die Ausgabe der Anfragen sind zu synchronisieren, aber nicht die tatsächliche Reaktion des Antrags. In Ihrem GCD-Beispiel beenden Sie Ihre dispatch_group_async, sobald die Anforderung ausgegeben wird, obwohl die Antwort noch nicht empfangen wurde. Entsprechend führen Sie in Ihrem Beispiel für die Vorgangswarteschlange den Blockvorgang aus, sobald die Anforderung ausgegeben wird. Diese Vorgänge warten jedoch nicht auf die Beendigung der Anforderungen.

Der einfache, wenn unelegante Ansatz besteht darin, nur einen im Completion-Handler des vorherigen aufzurufen. Wenn Sie sie in separate Funktionen einfügen, vermeiden Sie die unordentliche Verschachtelung von Completion-Handlern.

Wenn Sie sich für eine elegantere Lösung suchen, lösen Sie diese mit dem Betrieb Warteschlangen durch diese NSOperation/Operation Unterklasse, und nur lösen die isFinished KVO in einer asynchronen Einwickeln, wenn die Anforderung erfolgt. Siehe Asynchrone Versus Synchronous Operations Abschnitt der Operation Reference, oder die etwas detailliertere (obwohl datiert) Diskussion in Operation Queues: Concurrent Versus Non-concurrent Operations in der Concurrency Programming Guide.

Ein weiterer eleganter Ansatz ist es, Versprechungen zu verwenden, etwa PromiseKit. Es erscheint mir als ziemlich dramatische Lösung (führe ein völlig neues asynchrones Muster ein), aber es löst dieses Problem gut.

Verwandte Themen