AFNetworking-2 waitUntilFinished funktioniert nicht

8

Ich weiß, dass es eine weitere ähnliche Frage gibt, aber es ist für eine ältere Version von AFNetworking, und beantwortet es trotzdem nicht wirklich.

Ich habe den folgenden Code:

%Vor%

Wenn ich das ausführe, sehe ich in meinem Log:

%Vor%

Das NSLog , das ist, nachdem das waitUntilFinished zuerst ausgelöst hat. Ich habe erwartet, dass es an zweiter Stelle feuert. Was vermisse ich?

    
Travis Griggs 09.12.2013, 17:36
quelle

1 Antwort

32

Ein paar Gedanken:

  1. Das Problem ist, dass waitUntilFinished auf den Abschluss der Kernnetzwerkoperation wartet, aber nicht auf die Blöcke " success " oder " failure completion" wartet. Wenn Sie auf die Abschlussblöcke warten möchten, können Sie einen Semaphor verwenden:

    %Vor%

    Sie können dies alternativ auch in Ihre eigene untergeordnete Unterklasse NSOperation einfügen, indem Sie isFinished in den Blöcken AFHTTPRequestOperation vervollständigen, wobei semaphore im Prozess eliminiert wird.

    Beachten Sie, dass completionQueue angegeben werden muss, wenn Semaphore in der Hauptwarteschlange ausgeführt werden weil AFNetworking in diesem Fall standardmäßig die Vervollständigungsroutinen an die Hauptwarteschlange sendet und Sie die Deadlock-Funktion aktivieren können.

  2. Abgesehen davon sollten Sie niemals die Hauptwarteschlange blockieren (schlechte UX, Ihre App könnte durch einen Watchdog-Prozess getötet werden, usw.). Wenn Sie dies also von der Hauptwarteschlange aus tun, würde ich die Verwendung von entweder waitUntilFinished oder der Semaphor. Es ist besser, wenn Sie alles, was Sie benötigen, aus den Completion-Blöcken heraus initiieren und die Hauptwarteschlange die Ausführung fortsetzen lassen, während dieser asynchrone Netzwerkvorgang läuft, z. B .:

    %Vor%

Es klingt, als ob Sie Ihr Modell zulassen möchten, dass die Benutzeroberfläche alle erforderlichen Aktualisierungen durchführt, wenn das Modellobjekt seine Aktualisierungen vorgenommen hat. Sie können also Ihre eigenen Blockparameter verwenden, damit der View-Controller dem Modellobjekt mitteilen kann, was zu tun ist (anstatt waitUntilFinished oder Semaphor zu verwenden, damit der Netzwerkvorgang die Hauptwarteschlange blockiert). Angenommen, Ihr Modell hat eine der folgenden Methoden:

%Vor%

Dann kann Ihr View-Controller etwa wie folgt vorgehen:

%Vor%

Unter dem Strich kann Ihr Code die gleiche Art von Abschlussblöcken verwenden, die AFNetworking verwendet. Wenn Sie möchten, dass das Modell Informationen zurückgibt, können Sie den Completion-Blöcken selbst weitere Parameter hinzufügen, aber ich nehme an, dass das obige die Grundidee darstellt.

    
Rob 09.12.2013, 18:30
quelle

Tags und Links