2011-10-07 17 views
6

que estoy tratando de realizar esta acción en el hilo principal:performSelectorOnMainThread con múltiples parámetros

[curItem.mButton setBackgroundImage:newArt forState:UIControlStateNormal]; 

Así que hago esto ...

cWrapperObject* obj = [cWrapperObject alloc]; 
[obj setupParams :curItem.mButton :newArt]; 
[obj performSelectorOnMainThread:@selector(setImageForButton) withObject:nil waitUntilDone:YES]; 

Siento que esto es malo, ¿alguien tiene alguna sugerencia sobre cómo podría abordar esto de manera diferente?

Respuesta

13

Otra opción es GCD. Puede invocar un bloque en la cola principal que se ejecuta en serie cuando se ejecuta el ciclo de ejecución. los bloques no están limitados a un objeto como performSelectorOnMainThread.

dispatch_async(dispatch_get_main_queue(), ^{ 
    // code here 
}); 

me escribió una comparación más exhaustiva de performSelectorXXX y GCD aquí completo con muestras:

GCD, Threads, Program Flow and UI Updating

Además, aquí hay otro relacionado SO mensaje:

GCD to perform task in main thread

4

Si necesita pasar solo un parámetro, debe configurar el argumento "withObject:" en el método performSelectorOnMainThread:withObject:waitUntilDone. Por lo que su método debe ser declarado como

-(void)setImageForButton:(id)parameter 

y se debe invocar el método en el hilo principal con:

[obj performSelectorOnMainThread:@selector(setImageForButton:) withObject:newArt waitUntilDone:YES]; 

Nota ':' en @selector(setImageForButton:) esto significa que este método se envió un mensaje con un argumento, pasó en withObject:

Cuestiones relacionadas