2013-08-30 50 views
2

首先:對不起,如果標題不是很清楚,我不能將我的問題轉化爲簡短的單詞!NSFetchRequest中的多個匹配的NSPredicate

請考慮以下情形:
- 你正在使用的核心數據存儲對象
- 你想從您的上下文
取對象 - 你想包括一個謂語只能使用特定的性質
獲取對象 - 您有一個包含鍵值對的NSDictionary,其中鍵代表屬性名稱,並且該值表示期望的值以匹配

如何才能最好地實現此目的?

目前我有以下,這是實現這一目標的快速和可能低效的方式:

NSDictionary *attributes = [NSDictionary dictionaryWithObjects: [NSArray arrayWithObjects:@"value1", @"value2", nil] forKeys: [NSArray arrayWithObjects:@"attr1", @"attr2", nil] ]; 

// Build predicate format 
NSString *predicate = @""; 
NSMutableArray *predicateArguments = [[NSMutableArray alloc] init]; 
int index = 0; 
for (NSString *key in attributes) { 
    NSString *value = [attributes objectForKey: key]; 
    predicate = [predicate stringByAppendingFormat: @"(%@ = %@) %@", key, @"%@", index == [attributes count]-1 ? @"" : @"AND "]; 
    [predicateArguments addObject: value]; 
    index++; 
} 

NSPredicate *matchAttributes = [NSPredicate predicateWithFormat:predicate argumentArray:predicateArguments]; 

-

是否有實現這一謂語較短或更有效的方式?

請注意,塊謂詞是不是一種選擇,由於無法與NSFetchRequest(核心數據)載

回答

4

略短,也許更優雅的方式是使用NSCompoundPredicate

NSDictionary *attributes = [NSDictionary dictionaryWithObjects: [NSArray arrayWithObjects:@"value1", @"value2", nil] forKeys: [NSArray arrayWithObjects:@"attr1", @"attr2", nil] ]; 

// Build array of sub-predicates: 
NSMutableArray *subPredicates = [[NSMutableArray alloc] init]; 
for (NSString *key in attributes) { 
    NSString *value = [attributes objectForKey: key]; 
    [subPredicates addObject:[NSPredicate predicateWithFormat:@"%K = %@", key, value]]; 
} 
// Combine all sub-predicates with AND: 
NSPredicate *matchAttributes = [NSCompoundPredicate andPredicateWithSubpredicates:subPredicates]; 

新增:更妙的是(感謝Paul.s):

NSMutableArray *subPredicates = [[NSMutableArray alloc] init]; 
[attributes enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) { 
    [subPredicates addObject:[NSPredicate predicateWithFormat:@"%K = %@", key, value]]; 
}]; 
NSPredicate *matchAttributes = [NSCompoundPredicate andPredicateWithSubpredicates:subPredicates]; 
+2

你能做出這樣使用塊計數'[attributes enumerateKeysAndObjectsUsingBlock:^(id key,id value,BOOL * stop),稍微(1行)更短且最可能更高效{subPredicates addObject:[NSPredicate predicateWithFormat:@「%K =%@」,核心價值]]; }];' –

+0

@ Paul.s:好主意! –

+0

感謝解決方案的人,非常有幫助。我將Paul.s評論複製到未來觀衆的答案中,以防他們錯過評論! – Joshua