warten auf completionHandler

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • warten auf completionHandler

    Hallo Leute!

    Bitte helft einem ObjectiveC-Genervten kurz auf die Sprünge.
    Ich muss in einer C-Funktion eine Methode mit completionHandler aufrufen und zwingend auf das Ergebnis warten. D.h. diese Funktion MUSS das Ergebnis des completionHandlers zurückliefern und darf NICHT vorher zurückkehren.
    Wie macht man sowas ?

    Gruß
    Thomas
  • Die Frage interessiert mich aber :D

    Ich sehe nicht, dass man nach Aufruf bis zur fertigen Ausführung des Blocks warten kann. Also würde ich die Statements, die anschliessend ausgeführt werden sollen, in den Completion-Handler verlagern. Eventuell der Lesbarkeit wegen in eine eigene Methode ausgelagert.

    Gibt es Alternativen?

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • So gehts

    Quellcode

    1. __block dispatch_semaphore_t sema = dispatch_semaphore_create(0);
    2. [self method: text completionHandler:^(NSData *data, NSError *error)
    3. {
    4. if (error)
    5. {
    6. machWas(error);
    7. }
    8. else
    9. {
    10. machWasAnderes(data);
    11. }
    12. dispatch_semaphore_signal(sema);
    13. }];
    14. dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    Alles anzeigen
    Man macht einfach solange irgendwelche Dinge, bis man tot ist.
    Und dann bekommen die anderen Kuchen.
  • Ich hatte den Fall auch schon häufig, sowohl unter Objective-C-Zeiten als auch mit Swift. Wie Chris schreibt, lässt sich das am z.B. mit einer Semaphore lösen. Allerdings fand ich diesen Lösungsweg sehr fehleranfällig, vor allem aus dem von @MCDan erwähnten Grund. Ich hab in einem Team-Projekt mal solch asynchrone / blockierende Funktionen gehabt. Ein Kollege hat eine davon dann auf dem Main Thread ausgeführt und es hat ewig gedauert, die Ursache für sporadisch auftretenden UI-Freezes zu finden.
    Ich nutze daher meistens Completion Handler für solche Sachen. Sprich, die asynchrone Funktion empfängt als Argument eine Funktion (ErgebnisTyp) -> Void, welche im Completion Handler der asynchronen Methode aufgerufen wird. Vorteil bei diesem Vorgehen ist, dass die Funktion nicht mehr blockierend ist und der Developer, der die Funktion nutzt, durch den erforderlichen Completion Handler sofort erkennt, dass das Ergebnis der Funktion erst verzögert zurückkommen könnte.
    Bei Swift gibt es außerdem seit kurzem auch JavaScript ähnlichen async/await-Syntax, aber hier geht es ja um Objective-C.