【发布时间】:2011-09-29 04:40:08
【问题描述】:
我对使用 NSPredicate 还很陌生,但我遇到了一个有点复杂的问题,我不太确定解决方案的最佳方法。
我正在尝试为一个名为 Instrument 的实体构建一个过滤器,它可以与许多程序一起使用。反过来,程序与一种或多种疾病有关。疾病与许多程序有关,仪器可用于多个程序。换句话说,我有以下多对多的关系:
Instruments <-> Procedures <-> Diseases
我想做的是使用 Disease.title 过滤仪器。在一个简单而神奇的世界里,这就像
//where predicate is used on the Instruments array
[NSPredicate predicateWithFormat:@"(procedures.diseases.title == %@)", diseaseTitleString];
逐段浏览(有一些错别字和命名错误),我发现过滤器知道Procedures和Diseases的字段足以告诉我“diseaseTypes”不是procedures上的字段,而“name”是不是疾病领域。天真让我希望这个简单的谓词能奏效。
我什么也得不到。
我也尝试过使用(ALL procedures.diseases.title == %@),但这也不起作用。
我已经看到了一些关于子谓词的事情,但没有什么真正让我觉得有效或对我很有意义的东西。
基本上我想获取列表:
NSArray *instruments = [[NSArray alloc] init];
for (Disease *disease in Diseases) {
if ([disease.title isEqualToString:titleString]) {
for (Procedure *procedure in disease.procedures) {
for (Instrument *instrument in procedure.instruments) {
if (![instruments containsObject:instrument]) {
[instruments addObject:instrument];
}
}
}
}
}
现在,我正在使用这种方法来获取一个可以基于其他谓词进行过滤的数组,它工作正常,但它很难看,我觉得有一种更好、更清洁的方法来过滤它。谁能帮助我了解 NSPredicate 设计的更精细用途?
【问题讨论】:
标签: objective-c ios cocoa-touch core-data nspredicate