Вопрос

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

-(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 так далее

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top