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?
Ein paar Gedanken:
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:
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.
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 .:
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:
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.
Tags und Links objective-c ios afnetworking-2