In der Apple-Dokumentation für NSRunLoop gibt es einen Beispielcode, der zeigt, dass die Ausführung ausgesetzt wird, während auf das Setzen eines Flags durch etwas anderes gewartet wird.Die beste Möglichkeit, NSRunLoop auf das Setzen eines Flags warten zu lassen?
Ich habe dies verwendet und es funktioniert, aber bei der Untersuchung eines Leistungsproblems habe ich es auf dieses Stück Code aufgespürt. Ich benutze fast genau das gleiche Stück Code (nur der Name der Flagge ist anders :) und wenn ich eine NSLog
in die Zeile setzen, nachdem das Flag gesetzt ist (in einer anderen Methode) und dann eine Zeile nach der while()
gibt es eine scheinbar zufällig zwischen den beiden Log-Anweisungen von mehreren Sekunden warten.
Die Verzögerung scheint auf langsameren oder schnelleren Maschinen nicht anders zu sein, variiert aber von Lauf zu Lauf, wobei sie mindestens ein paar Sekunden und bis zu 10 Sekunden beträgt.
Ich habe dieses Problem mit dem folgenden Code bearbeitet, aber es scheint nicht richtig, dass der ursprüngliche Code nicht funktioniert.
NSDate *loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];
while (webViewIsLoading && [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:loopUntil])
loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];
diesen Code verwenden, werden die Protokollanweisungen, wenn das Flag gesetzt und nach der while-Schleife sind heute durchweg weniger als 0,1 Sekunden auseinander.
Wer irgendwelche Ideen, warum der ursprüngliche Code zeigt dieses Verhalten?
Ich denke, dass Sie das Beispiel in der Dokumentation gegeben falsch verstanden; Die Verwendung dieses Beispielcodes ist, wenn Sie die Ausführung eines Runloops beenden möchten (um nicht über die Flag-Änderung benachrichtigt zu werden) https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/ NSRunLoop_Class/Reference/Reference.html # // Apple_ref/occ/instm/NSRunLoop/run – kernix