2013-03-30 126 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的偉大暗示:) –