使用 NSPredicate 的不同对象

Posted

技术标签:

【中文标题】使用 NSPredicate 的不同对象【英文标题】:Distinct Object using NSPredicate 【发布时间】:2012-01-03 09:07:54 【问题描述】:

我有一个自定义对象的 NSArray。考虑自定义对象具有 PageNumber 属性。我想用“customObject.PageNumber is distinct”之类的条件过滤我的 NSArray。

我知道我可以遍历数组并消除具有重复 pageNumbers 的对象。但是有什么简单的方法可以做到吗?我试过了,

[myarray valueForKeyPath:@"distinctUnionOfObjects.pageNumber"];

它给了我唯一的页码(如 7、8、9)。但我想要自定义对象本身,而不仅仅是页码。任何谓词可以帮助我吗?

【问题讨论】:

【参考方案1】:

我创建了一个简单的库,称为 Linq to ObjectiveC,它是一组方法,可以让这类问题更容易解决。在您的情况下,您需要 Linq-to-ObjectiveC distinct 方法:

NSArray* itemsWithUniquePageNumbers = [items distinct:^id(id item) 
    return [item pageNumber];
];

这会返回一个对象数组,每个对象都有一个唯一的页码。

【讨论】:

这很酷。谢谢!【参考方案2】:

是的,这可以在NSPredicate 的帮助下实现

customObject=[(NSArray*)[myArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self.PageNumber==%d",pageNumber]] lastObject];
//pageNumber is an integer

过滤后的数组是您的自定义对象的NSArray,它是使用谓词过滤的结果。由于您的页码是唯一的,因此它将仅返回一个对象的数组。我们通过将lastObject 消息传递给它来得到它。

参考: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Predicates/predicates.html#//apple_ref/doc/uid/TP40001798-SW1

【讨论】:

对不起。我的问题导致误解。我会更新它。我想要其对象具有唯一页码的数组。 @Vignesh 我也面临同样的问题。你有什么解决办法吗?

以上是关于使用 NSPredicate 的不同对象的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicate 使用 OR 错误

CoreData:NSPredicate 按日期过滤

NSPredicate:与日期iOS的to-Many关系

过滤巨大的 NSArray

使用 NSPredicate 的不同对象

如何使用 NSPredicate 通过 CoreData 中的 NSSet 属性的元素过滤对象?