2017-12-05 3 views
5

Ich habe einen Code geerbt, der diese ziemlich ungewöhnliche verschachtelte Sequenz hat. Das übliche Paradigma würde einen einzelnen Versand an die Hauptwarteschlange haben, um die UI zu aktualisieren. Der Code, der unten gezeigt wird, verschachtelt einen Versand an die Hauptwarteschlange innerhalb eines anderen Versands an die Hauptwarteschlange.Was ist der Zweck der Verschachtelung von dispatch_async (dispatch_get_main_queue()^{})?

- (void)viewDidLoad 
{ 
// Setup some data 
// Adjust UI 

dispatch_async(myBackgroundQueue, ^{ 
    while(Do_some_time_consuming_work) { 

    // Time consuming work goes here 

    if (things_are_going_slowly) { 

     dispatch_async(dispatch_get_main_queue(), ^{ // <- one of these two seems redundant 
      dispatch_async(dispatch_get_main_queue(), ^{ // <- one of these two seems redundant 

      stillWorkingLabel.hidden = NO; //Let user know the work is still ongoing 
      }); 
     }); 
    ) 

    // Finish time-consuming work 
    } 

    }); 

} 

Was ist der Zweck, wenn überhaupt, dispatch_async(dispatch_get_main_queue() die Verschachtelung? Diese verschachtelte Sequenz wird an mehreren Stellen in der App angezeigt. Es scheint mir, dass nur ein Versand in die Hauptwarteschlange benötigt wird.

Ich glaube, ich habe alle relevanten Fragen zu verwandten Themen hier und über Google-Suche gelesen, aber ich habe niemanden gefunden, der vorschlägt, zwei identische Versendungen zu verschachteln.

Die App funktioniert gut, mit der Benutzeroberfläche wie im obigen Beispiel und an anderen Stellen im Code erwartet aktualisiert.

Die meisten Code der App verwendet die übliche nicht verschachtelte Version des obigen Schemas, und natürlich funktioniert es auch gut.

Ich bin geneigt, nur diese verschachtelten Anrufe mit einem einzigen Versand zu ersetzen, aber vielleicht fehlt mir hier etwas. Jeder Rat würde geschätzt werden.

Antwort

2

Ich kann nicht einen einzigen Vorteil, dies zu tun, und denke an Gründe, nicht zu denken. Es wird die Ausführung des inneren Verschlusses verzögern, sowie eine kleine Menge zusätzlicher Ressourcen nehmen. (Es wird die App zwingen, mindestens 2 Durchläufe durch die Ereignisschleife zu durchlaufen, bevor das Workitem ausgeführt wird.)

Ich denke, das Entfernen der verschachtelten Aufrufe ist das Richtige zu tun.

0

Nesting zwei dispatch_queues für die Haupt keinen Sinn machen, die gerade nach vorne Weg ist, dass

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

// perform long task here 

dispatch_async(dispatch_get_main_queue(), ^(){ 

    //Add method, task you want perform on mainQueue 
//Control UIView, IBOutlet all here 

}); }); 
Verwandte Themen