executeSelectorOnMainThread с несколькими параметрами - PullRequest
6 голосов
/ 08 октября 2011

Я пытаюсь выполнить это действие в главном потоке:

[curItem.mButton setBackgroundImage:newArt forState:UIControlStateNormal];

Итак, я делаю это ...

cWrapperObject* obj = [cWrapperObject alloc];
[obj setupParams :curItem.mButton :newArt];
[obj performSelectorOnMainThread:@selector(setImageForButton) withObject:nil waitUntilDone:YES];

Мне кажется, что это плохо, у кого-то естькакие-нибудь предложения о том, как я мог бы подойти к этому по-другому?

Ответы [ 2 ]

13 голосов
/ 08 октября 2011

Другой вариант - GCD. Вы можете вызвать блок в главной очереди, который запускается последовательно при запуске цикла выполнения. блоки не ограничены одним объектом, таким как executeSelectorOnMainThread.

dispatch_async(dispatch_get_main_queue(), ^{
   // code here
});

Я написал более полное сравнение executeSelectorXXX и GCD здесь вместе с образцами:

GCD, потоки, поток программ и обновление пользовательского интерфейса

Кроме того, вот еще один связанный пост SO:

GCD для выполнения задачи в главном потоке

4 голосов
/ 08 октября 2011

Если вам нужно передать только один параметр, вы должны установить аргумент «withObject:» в методе performSelectorOnMainThread:withObject:waitUntilDone. Таким образом, ваш метод должен быть объявлен как

-(void)setImageForButton:(id)parameter

и вы должны вызвать метод в главном потоке с помощью:

[obj performSelectorOnMainThread:@selector(setImageForButton:) withObject:newArt waitUntilDone:YES];

Примечание ':' в @selector(setImageForButton:) это означает, что этот метод будет передан с одним аргументом, переданным в withObject:

...