如何将多个NSPredicate用于多个搜索值

时间:2013-02-26 09:32:17

标签: ios nspredicate

我正在使用UITextField作为搜索字段:用户可以输入以逗号分隔的多个搜索值。通过键入我想在我的NSArray中找到与搜索组件之一匹配的每个自定义对象。

我的自定义对象没有属性(可用于搜索)。接收值我必须致电[myObject fieldForKey:@"username"].value;。因此,我必须使用[NSPredicate predicateWithBlock](或者我不可能采用其他方式)。

我的搜索方法(将在TextField中更改字符时调用):

-(void)searchEntriesWithString:(NSString*)searchString {
    NSArray *dataSource = [NSArray arrayWithArray:_allObjects];

    searchString = [searchString stringByReplacingOccurrencesOfString:@" " withString:@""];

    NSArray *components = [searchString componentsSeparatedByString:@","];
    NSMutableArray *predicates = [NSMutableArray array];
    for (NSString *value in components) {
        NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {

        return ( [[(MyObject*)evaluatedObject fieldForKey:@"username"].wert hasPrefix:value ]);
        }];

        [predicates addObject:predicate];
    }

        NSPredicate *resultPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:predicates];

    NSMutableArray searchResultArray = [NSMutableArray arrayWithArray:[dataSource filteredArrayUsingPredicate:resultPredicate]];
}

假设有以下dataSource:

  • Object1,用户名为“userA”
  • Object2,用户名为“userB”
  • Object3,用户名为“userC”

使用'[self searchEntriesWithString:@“userA,userB”]'调用方法应该生成一个包含Object1和Object2的数组。

但我没有得到这个结果。

1 个答案:

答案 0 :(得分:3)

由于你想要一个的搜索组件,而不是所有的搜索组件,我认为你应该使用过:

NSPredicate *resultPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:predicates];

正如你使用andPredicateWithSubpredicates一样,一个术语需要传递给“userA”“userB”。

[我意识到你在三个月前问过这个问题,找到了一个工作,并继续前进,但我想我会留下一个建议]