通过字符串运行一堆方法并接收一个值

Posted

技术标签:

【中文标题】通过字符串运行一堆方法并接收一个值【英文标题】:Running a bunch of methods by string and receiving a value 【发布时间】:2014-01-20 18:48:37 【问题描述】:

我有一堆返回布尔值的方法。这些是检查 n 个条件的测试。如果其中之一返回 YES,则条件无效。类似的东西

- (BOOL) areNumbersInvalid 



- (BOOL) areNumbersBigger 



// etc...

有数百种方法。

实际上我会这样运行它们:

if ([self areNumbersInvalid]) 
   [self failed];


if ([self areNumbersBigger]) 
   [self failed];


// etc

想象一下每个方法都有数百行这样的代码。

我认为我可以将所有方法名称放在一个数组上并使用类似的东西

  [methods enumerateObjectsWithOptions:NSEnumerationConcurrent
                            usingBlock:^(id obj, NSUInteger idx, BOOL *stop) 

                              NSString *oneMethod = (NSString *)obj;
                              SEL selector = NSSelectorFromString(oneMethod);

                              BOOL failed = [self  performSelector:selector withObject:nil afterDelay:0.0f];

                              if (failed) 
                                // do something
                              


                            ];

但我不能使用这条线

BOOL failed = [self  performSelector:selector withObject:nil afterDelay:0.0f];

因为这个 performSelector 行期望一个 void return 不会返回一个 BOOL 值

我该怎么做?

【问题讨论】:

【参考方案1】:

我相信you can use NSInvocation for that:

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:
                            [[someInstance class] instanceMethodSignatureForSelector:selector]];
[invocation setSelector:selector];
[invocation setTarget:someInstance];
[invocation invoke];
BOOL returnValue;
[invocation getReturnValue:&returnValue];
NSLog(@"Returned %@", returnValue? @"YES" : @"NO");

【讨论】:

P E R F E C T ! ! !谢谢!【参考方案2】:

创建一个类属性

@property BOOL failed;

在这些方法中,相应地更新失败的属性。 并在执行后

[self  performSelector:selector withObject:nil afterDelay:0.0f];

检查失败。

【讨论】:

【参考方案3】:

如果您在编译时知道方法签名(本例中为BOOL (*)(id, SEL)),则可以这样做

SEL selector = // ...
id obj = // ...
BOOL (*imp)(id, SEL);
imp = (BOOL (*)(id, SEL))[obj methodForSelector:selector];
BOOL result = imp(obj, selector); // call it

与 NSInvocation 相比开销更少

【讨论】:

以上是关于通过字符串运行一堆方法并接收一个值的主要内容,如果未能解决你的问题,请参考以下文章

如何并行运行单个Lua脚本对多个Redis值?

前端传字符串后端能解析成数字嘛

ajax怎么接收一个List

hasNextInt()方法

通过 ZeroMQ 以字符串形式接收对象然后通过另一个套接字以零副本发送它的正确方法是啥?

在 Perl 中,如何调用字符串中名称的方法?