2015-11-10 39 views
0

我有一个NSPredicate看起来像这样:NSPredicate处理NIL的字符串作为任何字符

NSPredicate *predicateSearch; 

    if ([category_array count]>0 && [location_array count]>0) { 
     predicateSearch =[NSPredicate predicateWithFormat:@"category_id IN %@ AND location_id IN %@ AND company_title CONTAINS %@",category_array,location_array,searchStr]; 
    } 
    else if ([category_array count]>0){ 

     predicateSearch =[NSPredicate predicateWithFormat:@"category_id IN %@ AND company_title CONTAINS %@",category_array,searchStr]; 
    } 
    else if([location_array count]>0){ 

     predicateSearch = [NSPredicate predicateWithFormat:@"location_id IN %@ AND company_title CONTAINS %@",location_array,searchStr]; 
    } 

    [fetchRequest setPredicate:predicateSearch]; 

由于NSPredicate是不能处理我现在用这个if语句格式化谓语Nil值和处理Nil值为'ANY'。 这里的问题是,如果它是Nil,我还想将searchStr作为“ANY”进行处理。 我试图在Nil的情况下将它设置为空字符串,但它不起作用。 有没有什么办法可以在每个案例中不使用任何If语句的情况下实现该目标(9条if语句太多)?

+0

您可以使用'andPredicateWithSubpredicates:'。 – Larme

回答

2

使用复合谓词。例如,根据您发布的内容:

NSPredicate *categoryPredicate = (category_array.count > 0) 
    ? [NSPredicate predicateWithFormat:@"category_id IN %@", category_array] 
    : [NSPredicate predicateWithValue:YES]; 

NSPredicate *locationPredicate = (category_array.count > 0) 
    ? [NSPredicate predicateWithFormat:@"location_id IN %@", location_array] 
    : [NSPredicate predicateWithValue:YES]; 

NSPredicate *searchPredicate = (searchStr.length > 0) 
    ? [NSPredicate predicateWithFormat:@"company_title CONTAINS %@", searchStr] 
    : [NSPredicate predicateWithValue:YES]; 

NSCompoundPredicate *predicate = 
    [NSCompoundPredicate 
    andPredicateWithSubpredicates:@[            
            categoryPredicate, 
            locationPredicate, 
            searchPredicate, 
            ] 
    ]; 
+0

非常感谢你的答复。我的问题是如果我想要searchPredicate是“OR”而不是其他两个AND比较 – BlackM

+0

只是发现了'orPredicateWithSubpredicates'。谢谢 – BlackM

+0

此外,复合谓词可以与其他复合谓词一起形成,允许任意嵌套和条件分组。 – Avi