ios objective-c iphone multithreading methods

ios - ¿Llamar a un método en el hilo principal?



objective-c iphone (4)

Primero que nada estoy escribiendo código para iphone. Necesito poder invocar un método en el hilo principal sin utilizar performSelectorOnMainThread . La razón por la que no deseo usar performSelectorOnMainThread es porque causa problemas cuando intento crear un simulacro para pruebas unitarias.

[self performSelectorOnMainThread:@Selector(doSomething) withObject:nil];

El problema es que mi simulacro sabe cómo llamar a algo, pero no sabe cómo llamar a performSelectorOnMainThread .

Entonces, ¿alguna solución?


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, échale un vistazo: https://github.com/goktugyil/EZSwiftExtensions


C objetivo

dispatch_async(dispatch_get_main_queue(), ^{ [self doSomething]; });

Rápido

dispatch_async(dispatch_get_main_queue()) { self.doSomething() }

Swift 3 y Swift 4

DispatchQueue.main.async{ self.doSomething() }


Hay un dicho en el software que agregar una capa de direccionamiento indirecto arreglará casi cualquier cosa.

Haga que el método doSomething sea un intérprete de comandos indirectos que solo realiza un performSelectorOnMainThread para llamar al método really_doSomething y que haga que el trabajo real de Something funcione. O bien, 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.


Y ahora en veloz 3:

DispatchQueue.main.async{ self.doSomething() }