如何调用performSelectorOnMainThread:使用带> gt的选择器1个参数?

时间:2009-09-22 14:55:45

标签: iphone cocoa-touch selector

performSelectorOnMainThread:的典型调用如下所示:

[target performSelectorOnMainThread:action withObject:foo waitUntilDone:NO];

其中“result”是传递给“action”的参数。相应的行动将是:

- (void)doSomethingWithThing1:(id *)thing1

调用带有>的操作的正确语法是什么?一个论点?如:

- (void)doSomethingWithThing1:(id *)thing1 andThing2(id *)thing2 andAlsoThing3(id *)thing3

[target performSelectorOnMainThread:action withObject:??? waitUntilDone:NO];

3 个答案:

答案 0 :(得分:15)

您可以将args放在字典或数组中并将其传递给特殊函数

- (void)doStuff:(NSString *)arg1 and:(NSString *)arg2 and:(NSString *)arg3 {
...
}

- (void)doStuff:(NSArray *)argArray {
    [self doStuff:[argArray objectAtIndex:0]
              and:[argArray objectAtIndex:1]
              and:[argArray objectAtIndex:2];
}

答案 1 :(得分:8)

在回复similar question将非对象传递给performSelectorOnMainThread:中的方法时,我指出了Dave Dribin的category on NSObject,它允许您执行以下操作:

[[person dd_invokeOnMainThread] doSomethingWithThing1:thing1 andThing2:thing2 andAlsoThing3:thing3];

用于在主线程上执行多参数方法。我认为这是一个非常优雅的解决方案。在幕后,他将事物包装在NSInvocation中,在主线程上调用它。

Amber framework也做了类似的事情。

答案 2 :(得分:1)

如果您希望保留接收方的方法签名,那么我认为您需要查看使用NSInvocation,它允许您指定多个参数值。

你可以打包你的电话,并使用字典作为你的论据的容器,如另一个答案中所建议的那样,但对我而言,这似乎有点代码味道。

沿着这条线的更好的解决方案是创建一个封装参数值的类 - 即强类型方法。因此,例如,您不是传递firstnamesurname,而是传递Person类的实例。这可能是一个更好的路径,因为参数较少的方法可以产生更清晰的代码 - 但这是一个whole other story