2012-07-09 130 views
2

考虑包含元素的核心数据数据库,其中每个元素都有一个名为symbol的属性,问题是获取每个符号的NSArray的最简洁的方法。这可以通过沿获取核心数据属性的NSArray

-(NSArray*)symbolsInDatabase { 
    ENTRY_LOG; 

    NSError* err; 

    NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"Element"]; 
    request.resultType  = NSDictionaryResultType; 
    request.propertiesToFetch = [NSArray arrayWithObject:@"symbol"]; 

    NSArray* arrayOfDictionaries = [self.database.managedObjectContext executeFetchRequest:request error:&err]; 
    NSMutableArray* symbols = [[NSMutableArray alloc]initWithCapacity:[arrayOfDictionaries count]]; 

    for (NSDictionary* d in arrayOfDictionaries) { 
    [symbols addObject:[d objectForKey:@"symbol"]]; 
    } 

    EXIT_LOG; 
    return symbols; 

} 

线的东西来完成但是有一种挥之不去的感觉,我失去了一些东西,而且我可以在一些巧妙的方式来使用-(NSArray*)filteredArrayUsingPredicate而不是迭代字典阵列上,提取对象为symbol键。

有关如何使这个更清洁的任何想法?

回答

1

事实上,valueForKeyPath选择:

NSArray *symbols = [arrayOfDictionaries valueForKeyPath:@"@unionOfObjects.symbol"]; 
+0

为 'NSArray的' 不可见@interface声明选择 'allValues' - 这是对的NSDictionary选择。 – Joe 2012-07-10 00:49:17

+0

对不起,我更正了答案,测试了它。 – Mundi 2012-07-10 07:34:55

+0

编辑以反映正确的选择器是valueForKeyPath,另请参阅http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueCoding/Articles/CollectionOperators.html以获取集合运算符的说明。 Upvote编辑批准。 – Joe 2012-07-11 01:47:54