2011-11-30 29 views
40

que me gustaría realizar un selector en el hilo principal desde otro hilo, pero el selector tiene varios argumentos, de forma similar a esta:iOS performSelectorOnMainThread con múltiples argumentos

-(void) doSomethingWith:(int) a b:(float)b c:(float)c d:(float)d e:(float)e { //... }

¿Cómo puedo conseguir este trabajo con performSelectorOnMainThread: withObject: waitUntilDone:?

EDITAR

me gustaría explicar por qué necesito esto.

Estoy trabajando con UIImageViews en el hilo principal, y hago los cálculos para ellos en otro hilo. Uso muchos cálculos, de modo que si hago todo en el hilo principal, la aplicación se demora. Sé que los elementos de la interfaz de usuario solo pueden manipularse en el hilo principal, por eso me gustaría que funcione de esta manera, de modo que el hilo principal pueda escuchar eventos táctiles sin retardos.

+0

posible duplicado de [performSelectorOnMainThread con parámetro múltiple] (http://stackoverflow.com/questions/7693203/performselectoronmainthread-with-multiple-parameter) –

Respuesta

96

Cuando se está utilizando IOS> = 4, que haría esto en su lugar:

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self doSomething:1 b:2 c:3 d:4 e:5]; 
}); 

Eso es como hacer waitUntilDone:NO. Si desea esperar hasta que el método haya finalizado, use dispatch_sync en su lugar.

+0

Tu respuesta fue la mejor para mi problema. Parece que solo en un 'dispatch_sync' es un' performSelector: afterDelay: 'en funcionamiento. – McDermott

+0

Es posible que también desee examinar [dispatch_after] (http://stackoverflow.com/a/4139331/400056), quizás pueda colapsar 'dispatch_sync' y' performSelector: afterDelay: 'en una sola llamada. – DarkDust

6

Tendrá que utilizar un NSInvocation

Crear el objeto, el objeto de selector y argumentos.
A continuación, utilice

[ invocationObject performSelectorOnMainThread: @selector(invoke) withObject: nil, waitUntilDone: NO ]; 
+0

Eso es tan NextStep ;-) Con GCD esto se puede resolver más fácilmente. – DarkDust

+3

Claro ... Pero podría ser útil saber cómo hacerlo sin GCD, incluso si GCD es efectivamente la forma preferida ahora. :) – Macmade

3

se puede pasar un objeto de tipo NSDictionary/NSArray tener argumentos necesarios.

y acepta el mismo tipo de objeto en su función. luego, descomponga los valores y proceda con el procesamiento.

que tienen que utilizar NSNumber para los valores numéricos para agregarlos a NSArray/NSDictionary y más tarde en su función, se puede convertir de nuevo con intValue/floatValue etc

mejor de dinero.

+0

Me gustaría pasar un UIImageView también. ¿Puedo hacer eso con NSArray? – McDermott

+1

@McDermott: Puedes poner * cada * objeto en un 'NSArray', así que sí, también puedes pasar un' UIImageView'. – DarkDust

Cuestiones relacionadas