performSelectorOnMainThread带有多个参数

时间:2011-10-07 21:50:17

标签: iphone objective-c ios multithreading asynchronous

我正在尝试在主线程上执行此操作:

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

所以我这样做......

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

我觉得这很糟糕,有没有人对我如何处理这种方式有任何建议?

2 个答案:

答案 0 :(得分:13)

另一个选择是GCD。您可以在主队列上调用一个块,该块在运行循环运行时以串行方式运行。块不限于像performSelectorOnMainThread这样的一个对象。

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

我在这里写了一个更全面的performSelectorXXX和GCD比较,包括样本:

GCD, Threads, Program Flow and UI Updating

此外,这是另一个相关的SO帖子:

GCD to perform task in main thread

答案 1 :(得分:4)

如果只需要传递一个参数,则应在方法performSelectorOnMainThread:withObject:waitUntilDone中设置“withObject:”参数。因此,您的方法应声明为

-(void)setImageForButton:(id)parameter

你应该在主线程上调用方法:

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

注意':'在@selector(setImageForButton:)中,这意味着此方法将使用一个参数发送消息,传递给withObject: