如何在谓词是方法的情况下执行NSArray filteredArrayUsingPredicate?

时间:2011-03-20 10:51:52

标签: iphone objective-c nsarray nspredicate predicate

如何在谓词是方法的情况下执行NSArray filteredArrayUsingPredicate?这是一个简单的代码示例在这里看起来像什么?

我一直试图通过谓词doco并且有点困惑。我可以看到它对于简单检查是如何工作的,但如果我有一个需要几行objective-c代码的检查来实现代码有效的代码:

  • 使用filteredArrayUsingPredicate
  • 过滤NSArray
  • 谓词将是一种方法,它以某种方式获取输入变量,执行任何检查和平衡,然后返回TRUE / FALSE作为返回值,无论项目是否应该被过滤

感谢

2 个答案:

答案 0 :(得分:7)

只要您使用iOS 4.0及更高版本,您就会很高兴知道这非常简单(以下内容不适用于3.x)。

您可以使用predicateWithBlock方法创建一个NSPredicate,它接受一个返回YES或NO作为参数的块。所以你想要的正是如此(如果你不熟悉块,它们基本上是一种封装方法的方法。见这里:http://pragmaticstudio.com/blog/2010/7/28/ios4-blocks-1

+ (NSPredicate *)predicateWithBlock:(BOOL (^)(id evaluatedObject, NSDictionary *bindings))block

答案 1 :(得分:6)

您可以使用@lxt建议的predicateWithBlock:方法,也可以使用FUNCTION方法。这可以让你构建一个如下所示的谓词:

[NSPredicate predicateWithFormat:@"FUNCTION(SELF, 'mySuperMethod:', %@)", aParameter];

如果使用该谓词过滤数组,则:

  • SELF将迭代地成为数组中的每个项目
  • 数组中的每个项目都将调用其-mySuperMethod:方法
  • -mySuperMethod:将收到aParameter作为方法的参数
  • -mySuperMethod:将返回BOOL <<<<<<这非常重要
  • NSNumber返回YES的所有对象都将包含在已过滤的数组中。

有关此语法的详细信息,请查看this blog post

那你为什么要在块方法上使用这种方法呢?我可以想到两个原因:

  • 向后兼容性
    • 如果你需要这个在Leopard上工作(Mac上的块是在Snow Leopard中引入的)。
    • 如果你需要这个在iOS 4.0之前的版本上工作(在iOS 4.0中引入了iOS上的块)。
  • 您希望序列化谓词以进行存档和以后的检索。只要-mySuperMethod:符合aParameter协议,这就没问题。块无法序列化。

但是,如果这些都不是要求,那么从长远来看,块方法可能会更好,因为它更明显和可读。 :)