Przede wszystkim piszę kod na iPhone'a. Muszę mieć możliwość wywołania metody w głównym wątku bez użycia performSelectorOnMainThread
. Powodem, którego nie chcę używać, performSelectorOnMainThread
jest to, że powoduje to problem, gdy próbuję utworzyć makietę do testów jednostkowych.
[self performSelectorOnMainThread:@Selector(doSomething) withObject:nil];
Problem polega na tym, że mój makieta wie, jak dzwonić, doSomething
ale nie wie, jak dzwonić performSelectorOnMainThread
.
Więc jakieś rozwiązanie?
ios
objective-c
iphone
multithreading
methods
aryaxt
źródło
źródło
W oprogramowaniu jest takie powiedzenie, że dodanie warstwy pośredniej naprawi prawie wszystko.
Niech metoda doSomething będzie powłoką pośrednią, która wykonuje tylko performSelectorOnMainThread w celu wywołania metody really_doSomething w celu wykonania rzeczywistej pracy Something. Lub, jeśli nie chcesz zmieniać metody doSomething, poproś jednostkę testową o wywołanie metody doSomething_redirect_shell, aby zrobić coś podobnego.
źródło
Oto lepszy sposób na zrobienie tego w Swift:
runThisInMainThread { () -> Void in // Run your code self.doSomething() } func runThisInMainThread(block: dispatch_block_t) { dispatch_async(dispatch_get_main_queue(), block) }
Jest zawarta jako standardowa funkcja w moim repozytorium, sprawdź: https://github.com/goktugyil/EZSwiftExtensions
źródło
dispatch_async
zablokowany kod po wywołaniu go? Cały sens używaniaasync
zamiastsync
NIE blokować tego, co następuje. (Oczywiścieblock
kod BĘDZIE zablokował wszystko inne w głównym wątku , ponieważ celem żądanego kodu jest wykonanie w głównym wątku. Jeśli chcesz uruchomić kod w tle, poprosiłbyś o inną kolejkę, niedispatch_get_main_queue
)A teraz w Swift 3:
DispatchQueue.main.async{ self.doSomething() }
źródło
// Draw Line func drawPath(from polyStr: String){ DispatchQueue.main.async { let path = GMSPath(fromEncodedPath: polyStr) let polyline = GMSPolyline(path: path) polyline.strokeWidth = 3.0 polyline.strokeColor = #colorLiteral(red: 0.05098039216, green: 0.5764705882, blue: 0.2784313725, alpha: 1) polyline.map = self.mapVu // Google MapView } }
źródło