iOS executeSelectorOnMainThread с несколькими аргументами - PullRequest
41 голосов
/ 30 ноября 2011

Я хотел бы выполнить селектор в главном потоке из другого потока, но у селектора есть несколько аргументов, подобных этому:

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

Как мне заставить это работатьс performSelectorOnMainThread: withObject: waitUntilDone:?

РЕДАКТИРОВАТЬ

Я хотел бы объяснить, зачем мне это нужно.

Я работаю с UIImageViews в главном потокеи я делаю расчеты для них в другом потоке.Я использую много вычислений, поэтому, если я делаю все в основном потоке, приложение отстает.Я знаю, что элементами пользовательского интерфейса можно манипулировать только в основном потоке, поэтому я хотел бы, чтобы он работал таким образом, чтобы основной поток мог прослушивать события касания без лагов.

Ответы [ 3 ]

96 голосов
/ 30 ноября 2011

Когда вы используете iOS> = 4, вы должны сделать это вместо:

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

Это как делать waitUntilDone:NO. Если вы хотите дождаться завершения метода, используйте dispatch_sync.

6 голосов
/ 30 ноября 2011

Вам нужно будет использовать NSInvocation

Создать объект, установить цель, селектор и аргументы.Затем используйте

[ invocationObject performSelectorOnMainThread: @selector( invoke ) withObject: nil, waitUntilDone: NO ];
3 голосов
/ 30 ноября 2011

вы можете передать один объект типа NSDictionary / NSArray с необходимыми аргументами.

и принять тот же тип объекта в вашей функции.затем разложите значения и приступите к обработке.

вам нужно использовать NSNumber для числовых значений, чтобы добавить их в NSarray / NSDictionary, а затем в вашей функции вы можете преобразовать их обратно с помощью intValue / * 1006.* etc

лучший доллар.

...