IOS выполняетSelectorOnMainThread с несколькими аргументами
Я хотел бы выполнить селектор основного потока из другого потока, но селектор имеет несколько аргументов, похожих на это:
-(void) doSomethingWith:(int) a b:(float)b c:(float)c d:(float)d e:(float)e {
//...
}
Как я могу заставить это работать с performSelectorOnMainThread: withObject: waitUntilDone:
?
ИЗМЕНИТЬ
Я хотел бы объяснить, зачем мне это нужно.
Я работаю с UIImageViews в основном потоке, и я делаю вычисления для них в другом потоке. Я использую множество вычислений, поэтому, если я делаю все в основном потоке, приложение отстает. Я знаю, что элементы пользовательского интерфейса можно манипулировать только по основному потоку, поэтому я бы хотел, чтобы он работал таким образом, поэтому основной поток может прослушивать события касания без задержек.
Ответы
Ответ 1
Когда вы используете iOS >= 4, вы должны сделать это вместо:
dispatch_async(dispatch_get_main_queue(), ^{
[self doSomething:1 b:2 c:3 d:4 e:5];
});
Это нравится делать waitUntilDone:NO
. Если вы хотите дождаться завершения метода, используйте вместо него dispatch_sync
.
Ответ 2
Вам понадобится NSInvocation
Создайте объект, установите цель, селектор и аргументы.
Затем используйте
[ invocationObject performSelectorOnMainThread: @selector( invoke ) withObject: nil, waitUntilDone: NO ];
Ответ 3
вы можете передать один объект типа NSDictionary/NSArray с необходимыми аргументами.
и принять тот же тип объекта в вашей функции.
затем разложите значения и продолжайте обработку.
вам нужно использовать NSNumber для числовых значений для добавления их в NSarray/NSDictionary, а позже в вашей функции, вы можете преобразовать их обратно с помощью intValue
/floatValue
и т.д.
лучший из долларов.