14

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

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

其中“结果”是传递给“动作”的参数。相应的操作是:

- (void)doSomethingWithThing1:(id *)thing1

调用具有 > 1 个参数的操作的正确语法是什么?如:

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

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

3 回答 3

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];
}
于 2009-09-22T15:02:12.820 回答
8

在回答关于将非对象传递给方法的类似问题performSelectorOnMainThread:时,我指出了 Dave Dribin在 NSObject 上的类别,它可以让您执行以下操作:

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

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

Amber 框架也做了类似的事情。

于 2009-09-22T16:50:05.677 回答
1

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

您可以按照另一个答案中的建议包装您的电话并使用字典作为您的参数的容器,但对我来说这似乎有点代码味道。

沿着这条线更好的解决方案是创建一个封装参数值的类 - 即强类型方法。因此,例如,您将传递一个类的实例,而不是传递firstname, 。这可能是一条更好的路线,因为具有较少参数的方法可以产生更清晰的代码 - 但这是另一回事surnamePerson

于 2009-09-22T15:01:24.930 回答