iOS performSelectorOnMainThread con più argomenti
-
26-10-2019 - |
Domanda
desidero eseguire un selettore sul thread principale da un altro thread, ma il selettore ha molteplici argomenti, simile a questo:
-(void) doSomethingWith:(int) a b:(float)b c:(float)c d:(float)d e:(float)e {
//...
}
Come posso ottenere questo lavoro con performSelectorOnMainThread: withObject: waitUntilDone:
?
Modifica
Vorrei spiegare perché ho bisogno di questo.
sto lavorando con UIImageViews sul thread principale, e fare i calcoli per loro su un altro thread. Io uso un sacco di calcoli quindi se faccio tutto sul thread principale, i GAL app. So che gli elementi dell'interfaccia utente possono essere manipolati solo sul thread principale, questo è il motivo per cui vorrei farlo funzionare in questo modo, in modo che il thread principale può ascoltare toccare eventi senza ritardi.
Soluzione
Quando si utilizza iOS> = 4, si farebbe questo, invece:
dispatch_async(dispatch_get_main_queue(), ^{
[self doSomething:1 b:2 c:3 d:4 e:5];
});
Ecco come fare waitUntilDone:NO
. Se si vuole aspettare fino a quando il metodo è finito, l'uso dispatch_sync
invece.
Altri suggerimenti
Sarà necessario utilizzare un NSInvocation
Crea l'oggetto, impostare il bersaglio, di selezione e gli argomenti.
Quindi, l'uso
[ invocationObject performSelectorOnMainThread: @selector( invoke ) withObject: nil, waitUntilDone: NO ];
è possibile passare un oggetto di tipo NSDictionary / NSArray avendo argomenti richiesti.
e accettare lo stesso tipo di oggetto nella funzione. poi, decomporre i valori e procedere con l'elaborazione.
è necessario utilizzare NSNumber per i valori numerici per aggiungerli al NSArray / NSDictionary e più tardi nella funzione, è possibile convertire indietro con intValue
/ floatValue
etc
meglio del dollaro.