2009-09-22 8 views
14

Una chiamata tipica di performSelectorOnMainThread: assomiglia a questo:Come si chiama performSelectorOnMainThread: con un selettore che richiede> 1 argomenti?

[target performSelectorOnMainThread:action withObject:foo waitUntilDone:NO]; 

dove "risultato" è un argomento passato alla "azione". Un'azione corrispondente sarebbe:

- (void)doSomethingWithThing1:(id *)thing1 

Qual è la sintassi corretta per chiamare un'azione che richiede un argomento> 1? Come ad esempio:

- (void)doSomethingWithThing1:(id *)thing1 andThing2(id *)thing2 andAlsoThing3(id *)thing3 

[target performSelectorOnMainThread:action withObject:??? waitUntilDone:NO]; 
+0

Buon tutorial su come farlo. http://goodliffe.blogspot.com/2011/01/ios-performselectoronmainthread-with.html –

risposta

8

In risposta ad una similar question sul passaggio di non-oggetti ad un metodo in performSelectorOnMainThread:, ho fatto notare di Dave Dribin category on NSObject, che ti permette di fare qualcosa di simile a quanto segue:

[[person dd_invokeOnMainThread] doSomethingWithThing1:thing1 andThing2:thing2 andAlsoThing3:thing3]; 

per eseguire il metodo multi-argomento sul thread principale. Penso che questa sia una soluzione piuttosto elegante. Dietro le quinte, avvolge le cose in un NSInvocation, invocandolo nel thread principale.

Il Amber framework fa qualcosa di simile a questo, pure.

+0

Dolce. Grazie per questa gemma Brad. – dugla

1

Se si desidera conservare la firma del metodo del ricevitore, allora penso che avrete bisogno di guardare con NSInvocation che permette di specificare più valori degli argomenti.

È possibile avvolgere la chiamata e utilizzare un dizionario come contenitore per gli argomenti come suggerito in un'altra risposta, ma a me sembra un po 'di odore di codice.

Una soluzione migliore lungo questa linea sarebbe quella di creare una classe che incapsula i valori degli argomenti, ovvero un approccio fortemente tipizzato. Ad esempio, invece di passare firstname, surname, si passa un'istanza di una classe Person. Questo è probabilmente un modo migliore per scendere perché i metodi con un numero inferiore di argomenti possono generare un codice più pulito, ma questo è uno whole other story.

15

Puoi farlo mettendo le args in un dizionario o un array e passaggio che per una funzione speciale

- (void)doStuff:(NSString *)arg1 and:(NSString *)arg2 and:(NSString *)arg3 { 
... 
} 

- (void)doStuff:(NSArray *)argArray { 
    [self doStuff:[argArray objectAtIndex:0] 
       and:[argArray objectAtIndex:1] 
       and:[argArray objectAtIndex:2]; 
} 
+1

Questo non funziona se uno degli argomenti è nullo. –

+5

non funziona anche con elefanti rosa ... qual è il tuo punto? – coneybeare

+2

@GrantlandChew ha un punto importante: non è possibile utilizzare in modo ingenuo un NSArray, è necessario convertire i valori nil in NSNull. Inoltre penso che gli elefanti rosa siano in realtà una sottoclasse di NSString. –

Problemi correlati