2015-11-10 35 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