如何调用performSelectorOnMainThread:与需要> 1个参数的选择?(H

2019-08-16 15:20发布

一个典型的呼叫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];

Answer 1:

在回答类似的问题在经过非对象的方法performSelectorOnMainThread:我指出戴夫Dribin的上NSObject的类别 ,它可以让你做的东西像下面这样:

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

主线程上执行您的多方论证方法。 我觉得这是一个非常优雅的解决方案。 在幕后,他包装在一个NSInvocation的事情,调用主线程上。

该琥珀框架做一些与此类似,也是如此。



Answer 2:

您可以通过将在字典或阵列您指定参数和它们递过来一个特殊功能做

- (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];
}


Answer 3:

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

你可以换你的电话,并使用字典作为你的论点的容器作为另一个答案建议,但对我来说这似乎有点像一个代码味道的。

沿着这条线更好的解决方案是创建一个封装了参数值的一类 - 即一个强类型的方法。 因此,例如,而不是通过firstnamesurname ,你会通过一个实例Person类。 这可能是一个更好的路线走下来,因为用更少的参数的方法可以得到更清晰的代码-但是这是一个整体的其他故事 。



文章来源: How do I call performSelectorOnMainThread: with an selector that takes > 1 arguments?