Zunächst schreibe ich Code für das iPhone. Ich muss in der Lage sein, eine Methode im Hauptthread aufzurufen, ohne sie zu verwenden performSelectorOnMainThread
. Der Grund, den ich nicht verwenden möchte, performSelectorOnMainThread
ist, dass es Probleme verursacht, wenn ich versuche, ein Modell für Unit-Tests zu erstellen.
[self performSelectorOnMainThread:@Selector(doSomething) withObject:nil];
Das Problem ist, dass mein Mock weiß, wie man anruft, doSomething
aber er weiß nicht, wie man anruft performSelectorOnMainThread
.
Also irgendeine Lösung?
ios
objective-c
iphone
multithreading
methods
aryaxt
quelle
quelle
In der Software gibt es ein Sprichwort, dass das Hinzufügen einer Indirektionsebene fast alles behebt.
Die doSomething-Methode muss eine Indirektionsshell sein, die nur einen performSelectorOnMainThread ausführt, um die Really_doSomething-Methode aufzurufen und die eigentliche Something-Arbeit auszuführen. Wenn Sie Ihre doSomething-Methode nicht ändern möchten, lassen Sie die Mock-Testeinheit eine doSomething_redirect_shell-Methode aufrufen, um etwas Ähnliches zu tun.
quelle
Hier ist ein besserer Weg, dies in Swift zu tun:
Es ist als Standardfunktion in meinem Repo enthalten. Schauen Sie sich das an: https://github.com/goktugyil/EZSwiftExtensions
quelle
dispatch_async
Code nach dem Aufruf gesperrt ist? Der ganze Sinn der Verwendungasync
stattsync
zu blockieren besteht darin, das Folgende NICHT zu blockieren. (Natürlichblock
blockiert der of-Code alles andere im Hauptthread , da der angeforderte Code im Hauptthread ausgeführt werden soll. Wenn Sie Hintergrundcode ausführen möchten, fragen Sie nach einer anderen Warteschlange. nichtdispatch_get_main_queue
.)Und jetzt in Swift 3:
quelle
quelle