42

我想从另一个线程在主线程上执行选择器,但选择器有多个参数,类似于:

-(void) doSomethingWith:(int) a b:(float)b c:(float)c d:(float)d e:(float)e { //... }

我怎样才能得到这个工作performSelectorOnMainThread: withObject: waitUntilDone:

编辑

我想解释一下为什么我需要这个。

我在主线程上使用 UIImageViews,并在另一个线程上为它们进行计算。我使用了很多计算,所以如果我在主线程上做所有事情,应用程序就会滞后。我知道 UI 元素只能在主线程上操作,这就是我希望它以这种方式工作的原因,因此主线程可以毫无延迟地监听触摸事件。

4

3 回答 3

100

当您使用 iOS >= 4 时,您可以这样做:

dispatch_async(dispatch_get_main_queue(), ^{
    [self doSomething:1 b:2 c:3 d:4 e:5];
});

这就像在做waitUntilDone:NO. 如果您想等到方法完成,请dispatch_sync改用。

于 2011-11-30T13:13:50.137 回答
7

您需要使用NSInvocation

创建对象,设置目标、选择器和参数。
然后,使用

[ invocationObject performSelectorOnMainThread: @selector( invoke ) withObject: nil, waitUntilDone: NO ];
于 2011-11-30T13:12:44.943 回答
3

您可以传递一个具有所需参数的 NSDictionary/NSArray 类型的对象。

并在您的函数中接受相同类型的对象。然后,分解这些值并继续处理。

您必须将 NSNumber 用于数值才能将它们添加到 NSarray/NSDictionary 以及稍后在您的函数中,您可以使用intValue/floatValue等将它们转换回来

最好的降压。

于 2011-11-30T13:13:26.377 回答