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