我想在另一个线程的主线程上执行一个选择器,但是选择器有多个参数,类似于:
-(void) doSomethingWith:(int) a b:(float)b c:(float)c d:(float)d e:(float)e {
//...
}
如何使用performSelectorOnMainThread: withObject: waitUntilDone:
?
修改
我想解释为什么我需要这个。
我在主线程上使用UIImageViews,并在另一个线程上对它们进行计算。我使用了很多计算,所以如果我在主线程上创建所有内容,那么应用程序就会滞后。我知道UI元素只能在主线程上操作,这就是为什么我希望它以这种方式工作,所以主线程可以听到没有滞后的触摸事件。
答案 0 :(得分:96)
当你使用iOS> = 4时,你会这样做:
dispatch_async(dispatch_get_main_queue(), ^{
[self doSomething:1 b:2 c:3 d:4 e:5];
});
这就像在做waitUntilDone:NO
。如果您想等到方法完成,请改用dispatch_sync
。
答案 1 :(得分:6)
您需要使用NSInvocation
创建对象,设置目标,选择器和参数 然后,使用
[ invocationObject performSelectorOnMainThread: @selector( invoke ) withObject: nil, waitUntilDone: NO ];
答案 2 :(得分:3)
你可以传递一个具有必需参数的NSDictionary / NSArray类型的对象。
并在函数中接受相同类型的对象。 然后,分解值并继续处理。
您必须使用NSNumber作为数字值才能将它们添加到NSarray / NSDictionary中,稍后在您的函数中,您可以使用intValue
/ floatValue
等将其转换回来
最好的降压。