En primer lugar, estoy escribiendo código para iphone. Necesito poder llamar a un método en el hilo principal sin usar performSelectorOnMainThread. La razón por la que no quiero usar performSelectorOnMainThreades que causa problemas cuando intento crear una simulación para pruebas unitarias.
[self performSelectorOnMainThread:@Selector(doSomething) withObject:nil];
El problema es que mi simulacro sabe cómo llamar doSomethingpero no sabe cómo llamar performSelectorOnMainThread.
Entonces, ¿alguna solución?
ios
objective-c
iphone
multithreading
methods
aryaxt
fuente
fuente

Hay un dicho en el software que dice que agregar una capa de indirección arreglará casi cualquier cosa.
Haga que el método doSomething sea un shell de indirección que solo hace un performSelectorOnMainThread para llamar al método really_doSomething para hacer el trabajo real de Something. O, si no desea cambiar su método doSomething, haga que la unidad de prueba simulada llame a un método doSomething_redirect_shell para hacer algo similar.
fuente
Aquí hay una mejor manera de hacer esto en Swift:
runThisInMainThread { () -> Void in // Run your code self.doSomething() } func runThisInMainThread(block: dispatch_block_t) { dispatch_async(dispatch_get_main_queue(), block) }Está incluido como una función estándar en mi repositorio, compruébalo: https://github.com/goktugyil/EZSwiftExtensions
fuente
dispatch_asynccódigo bloqueado después de llamarlo? El objetivo de usar enasynclugar desyncNO es bloquear lo que sigue. (Por supuesto, elblockcódigo bloqueará cualquier otra cosa en el hilo principal , ya que el objetivo del código solicitado es ejecutarse en el hilo principal. Si desea ejecutar código en segundo plano, entonces debe solicitar una cola diferente, nodispatch_get_main_queue.)Y ahora en Swift 3:
DispatchQueue.main.async{ self.doSomething() }fuente
// 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 } }fuente