2011-10-07 24 views
6

sto cercando di eseguire questa azione sul thread principale:performSelectorOnMainThread con parametri multipli

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

Quindi lo faccio ...

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

Mi sento come se questo è un male, qualcuno ha qualche suggerimento su come potrei approcciarlo in modo diverso?

risposta

13

Un'altra opzione è GCD. È possibile richiamare un blocco sulla coda principale che viene eseguito in modo seriale quando viene eseguito il ciclo di esecuzione. i blocchi non sono limitati a un oggetto come performSelectorOnMainThread.

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

ho scritto un confronto più completo di performSelectorXXX e GCD qui completo di campioni:

GCD, Threads, Program Flow and UI Updating

Inoltre, ecco un altro correlati SO postale:

GCD to perform task in main thread

4

Se è necessario passare solo un parametro, è necessario impostare l'argomento "withObject:" nel metodo performSelectorOnMainThread:withObject:waitUntilDone. Così il vostro metodo dovrebbe essere dichiarato come

-(void)setImageForButton:(id)parameter 

e si dovrebbe richiamare il metodo sul thread principale con:

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

Nota ':' in @selector(setImageForButton:) questo significa che questo metodo sarà messaged con un solo argomento, passato in withObject:

Problemi correlati