NSSet来自对象的属性(性能)

时间:2013-03-30 09:24:46

标签: ios objective-c performance 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];

也许我做错了什么,但它没有起作用:/

我感兴趣的是,如果有一个可以显着加快这个过程的解决方案吗?我可能忽略了一些东西。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

如果您只对category属性的(不同)值感兴趣,请设置

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

用于获取请求。然后,获取请求返回包含category值的字典数组(而不是托管对象)。

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

答案 1 :(得分:1)

Checkout MagicalRecord,这是一个使用Core Data的便利库。这应该可以帮助你完成很多这些任务。

祝你好运。