Gibt es eine Möglichkeit, das Javascript synchron vom Hauptthread abzufragen?
Javascript wird aus dem systemeigenen Code mit einer asynchronen Funktion mit einem Callback-Parameter abgefragt, um die Antwort zu behandeln:
%Vor%Asynchrones Verhalten kann normalerweise synchron gemacht werden, indem der Thread & amp; Steuerung der Ausführung mit einem Semaphor:
%Vor% ... aber in diesem Fall, weil der completionHandler
immer im Hauptthread aufgerufen wird, die Code Deadlocks, weil der completionHandler
Block niemals ausgeführt wird (Hauptthread wurde von der .pause angehalten) dispatch_semaphore_wait
in der letzten Zeile)
Irgendwelche Vorschläge?
BEARBEITEN
Ich möchte den Hauptthread lieber nicht blockieren, um diesen Code auszuführen. Aber ich kann nicht vom Hauptthread entkoppeln, ohne meine APIs von synchron zu asynchron zu ändern, mit einem Domino-Effekt den ganzen Stapel hinauf (z. B. von let ua = computeUserAgent()
bis computeUserAgent() {(ua: String)->Void in /*Use ua value here */}
). Also muss ich zwischen zwei Ansätzen wählen, die beide Nachteile haben, und ich würde eher den Ansatz wählen, der meine internen APIs nicht durcheinander bringt, besonders für eine Aufgabe, die so trivial ist wie das Nachschlagen des Benutzeragenten.
Wenn Sie dies tun müssen ...
Wie in einem Kommentar zu dieser Antwort vorgeschlagen, könntest du eine enge Schleife um deinen Semaphor herum laufen lassen. Warte so.
%Vor%Tags und Links ios grand-central-dispatch ios8 wkwebview semaphore