2013-03-30 96 views
0

我试图创建一个从未知(可能很多)对象属性中收集的字符串NSSet来自对象属性的NSSet(性能)

我的应用程序的用户在本月中记录对象 - 它们具有不同的属性,我只对NSString *category名称感兴趣。

Object.h 
NSString *category 
... 

在一个月内,他可能会记录10到1000个这样的对象,存储在coredata中。用户可以定义自己的类别 - 我必须找出哪个类别在当月使用(创建一个导出文件)。

目前我做以下(伪)

NSArray *allObjects = [_dataHandler fetchAllObjectsForMonth:monthToExport]; 
NSMutableSet *allCategoryNamesSet = [[NSMutableSet alloc]init]; 
for(Object *obj in allObjects){ 
    [allCategoryNamesSet addObject:obj.category]; 
} 

Wheras这个作品,它得到了很多的对象很慢作为取需要时间和迭代,以及课程。

我已经试过类似的东西还有:

NSArray *categories = [allObjects valueForKeyPath:@"category"]; 
NSSet *allCategorieNamesSet = [NSSet initWithArray:categories]; 

也许我做错了什么,但它没有相当的工作:/

我所感兴趣的是,如果有一个解决办法,可以大大加快这个过程?我可能忽略了一些东西。

任何想法?

+0

是否有任何问题'NSMutableSet * allCategoryNamesSet = [NSMutableSet setWithArray:allObjects];'? –

+0

是的。那么我会得到一个由对象组成的集合而不是对象的类别属性。我需要一组在本月内使用的所有类别名称:) –

回答

3

如果你有兴趣只在category属性的(不同)值,设置

[request setResultType:NSDictionaryResultType]; 
[request setPropertiesToFetch:@[@"category"]]; 
[request setReturnsDistinctResults:YES]; 

您提取请求。该提取请求然后返回包含category值的字典数组(而不是托管对象)。

好处是这个“过滤”是在SQLite级别完成的。一个缺点(或“警告”)是这意味着setIncludesPendingChanges:NO,即取回请求仅针对保存的数据库完成,并且不包括未保存的未决修改。

+0

其实这是我感兴趣的所有! a会在今天下午发布,但这看起来非常有希望!大+1,也许今天晚些时候接受:) –

+0

工作完美和快速!非常感谢 :) –

1

结帐MagicalRecord,这是一个与Core Data一起工作的便利库。这应该可以帮助你完成很多这些任务。

祝你好运。

+0

非常感谢您为此链接!我肯定会在未来的项目中使用它。该应用程序已经在appstore中,所以我不会去改变coredata设置了。这个问题是为了一个新版本的项目。但+1的伟大暗示:) –