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 performSelectorOnMainThread
es 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 doSomething
pero 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_async
código bloqueado después de llamarlo? El objetivo de usar enasync
lugar desync
NO es bloquear lo que sigue. (Por supuesto, elblock
có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