2017-06-30 3 views
1

ich zwei Asynchron-Methoden haben:Mehrere Asynchron-Methoden, ein Abschluss-Handler

- (void)login: (void (^)(BOOL))completion{ 
    // some network stuff with completion 
} 

und

- (void)download: (void (^)(BOOL))completion{ 
     // some network stuff with completion 
    } 

für einen Hintergrund holen, muss ich beide Verfahren abgeschlossen werden, und nur ein Abschluss zurück.

Ich könnte natürlich, nisten die Methoden, die als solche

- (void)login: (void (^)(BOOL))completion{ 
     //.... 
     [self download:^(BOOL success) { 
      //.... 
       if (success){ 
        completion(true); 
        } 
     }]; 
    } 

aber sobald ich hinzufügen eine oder mehrere Methoden, die zur gleichen Zeit abgeschlossen werden müssen, Code wird chaotisch.

Ich erinnere mich gelesen zu haben über einen Weg, mit dem Sie alle diese Methoden auf einen Thread gruppieren könnten, aber ich habe einfach nicht das richtige Vokabular, um das hier auf SO oder anderswo zu finden.

Ich hoffe, Sie verstehen, worüber ich spreche, und zeigen Sie mir in die richtige Richtung.

dank voraus

+0

Denken Sie an dispatch_barrier_async? – onnoweb

+1

Suchen Sie in Versandgruppen. Sie könnten diese Links nützlich finden: [1] (http://commandshift.co.uk/blog/2014/03/19/using-dispatch-groups-to-wait-for-multiple-web-services/) [2 ] (https://www.raywenderlich.com/63338/grand-central-dispatch-in-depth-part-2) – albertamg

+0

würde ich gerne. Du hast mich in die richtige Richtung gelenkt, aber deine Antwort enthält diese Richtung nicht. Was für mich funktionierte, war: dispatch_group_t serviceGroup = dispatch_group_create(); dispatch_group_enter (serviceGroup); [asyncMethod:^(BOOL Erfolg) { if (Erfolg) { dispatch_group_leave (serviceGroup); } }]; – Sjakelien

Antwort

1

Was können Sie tun, ist die completion block bis auf die download-Methode übergeben, um beim Download die Fertigstellung abgeschlossen ist, wie so bis der Anrufer wieder den ganzen Weg gekettet ist:

- (void)login: (void (^)(BOOL))completion{ 
    // some network stuff with completion 
    [self download:completion]; 
} 

- (void)download: (void (^)(BOOL))completion{ 
    completion(YES); 
    // some network stuff with completion 
} 
+0

nun, das habe ich schon in meiner Frage vorgeschlagen. – Sjakelien

2

Wenn die Aufgabe stellt wirklich eine Abhängigkeit dar und es ist möglich, dass Sie in Zukunft weitere Methoden hinzufügen müssen. Vielleicht sollten Sie die Verwendung von NSOperationQueue in Betracht ziehen.

Verwandte Themen