对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];
答案 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
,它允许您指定多个参数值。
你可以打包你的电话,并使用字典作为你的论据的容器,如另一个答案中所建议的那样,但对我而言,这似乎有点代码味道。
沿着这条线的更好的解决方案是创建一个封装参数值的类 - 即强类型方法。因此,例如,您不是传递firstname
,surname
,而是传递Person
类的实例。这可能是一个更好的路径,因为参数较少的方法可以产生更清晰的代码 - 但这是一个whole other story。