0

NSSet未知の (おそらく多数の) オブジェクトの属性から収集された文字列を作成しようとしています。

私のアプリのユーザーは、月にオブジェクトをログに記録しますNSString *category。名前だけに関心があるのに、オブジェクトにはさまざまな属性があります。

Object.h
NSString *category
...

1 か月の間に、10 ~ 1000 個のそのようなオブジェクトをログに記録し、コアデータに保存します。ユーザーは独自のカテゴリを定義できます。その月にどのカテゴリが使用されたかを調べる必要があります (エクスポート ファイルを作成するため)。

現在、私は次のことを行っています(疑似コード)

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

これは機能しますが、フェッチに時間がかかり、もちろん反復にも時間がかかるため、多くのオブジェクトでは非常に遅くなります。

私もそのようなことを試しました:

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

たぶん私は何か間違ったことをしましたが、うまくいきませんでした:/

私が興味を持っているのは、このプロセスを大幅にスピードアップできるソリューションがあるかどうかです。私が見落としていたかもしれない何か。

何か案は?

4

2 に答える 2

3

category属性の (個別の) 値のみに関心がある場合は、次のように設定します。

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

あなたの取得要求のために。次に、フェッチ要求は、category値を含む (管理対象オブジェクトではなく) 辞書の配列を返します。

利点は、この「フィルタリング」が SQLite レベルで行われることです。1 つの欠点 (または「警告」) は、これが意味することsetIncludesPendingChanges:NOです。つまり、フェッチ要求は保存されたデータベースに対してのみ行われ、保存されていない保留中の変更は含まれません。

于 2013-03-30T09:34:43.520 に答える
1

Core Data を操作するための便利なライブラリである MagicalRecord を確認してください。これは、これらのタスクの多くを実行するのに役立ちます。

幸運を。

于 2013-03-30T09:28:45.013 に答える