我正在尝试在主线程上执行此操作:
[curItem.mButton setBackgroundImage:newArt forState:UIControlStateNormal];
所以我这样做......
cWrapperObject* obj = [cWrapperObject alloc];
[obj setupParams :curItem.mButton :newArt];
[obj performSelectorOnMainThread:@selector(setImageForButton) withObject:nil waitUntilDone:YES];
我觉得这很糟糕,有没有人对我如何处理这种方式有任何建议?
答案 0 :(得分:13)
另一个选择是GCD。您可以在主队列上调用一个块,该块在运行循环运行时以串行方式运行。块不限于像performSelectorOnMainThread这样的一个对象。
dispatch_async(dispatch_get_main_queue(), ^{
// code here
});
我在这里写了一个更全面的performSelectorXXX和GCD比较,包括样本:
GCD, Threads, Program Flow and UI Updating
此外,这是另一个相关的SO帖子:
答案 1 :(得分:4)
如果只需要传递一个参数,则应在方法performSelectorOnMainThread:withObject:waitUntilDone
中设置“withObject:”参数。因此,您的方法应声明为
-(void)setImageForButton:(id)parameter
你应该在主线程上调用方法:
[obj performSelectorOnMainThread:@selector(setImageForButton:) withObject:newArt waitUntilDone:YES];
注意':'在@selector(setImageForButton:)
中,这意味着此方法将使用一个参数发送消息,传递给withObject: