0

タグ付きオブジェクトの配列を列挙しようとしています。各オブジェクトには、列挙されたオブジェクトの正しいエンティティを取得するための述語として使用する「タグ」属性を持つ対応するコア データ エンティティがあります。以下のコードを参照してください。

列挙内のエンティティを更新しているため、これがいくつかの問題を引き起こしているようです。問題は、フェッチが列挙よりも遅いことであると思われます。この配列を列挙してフェッチエンティティを適切に更新するにはどうすればよいですか?

[array enumerateObjectsUsingBlock:^(obj *SomeClass, NSUInteger idx, BOOL *stop){

    currentEntityForEnumeratedObject = [targetVC fetchEntityForTag:obj.tag createIfNeccessary:NO error:nil];

    currentEntityForEnumeratedObject.someAttribute = [NSNumber numberWithInt:obj.somePropertyOfObj];

}];
4

1 に答える 1

1

原則として、列挙しているオブジェクトを更新することはできません。ドキュメントから:

コレクションが変更可能であっても、高速列挙中にコレクションを変更することはできません。ループ内で収集されたオブジェクトを追加または削除しようとすると、実行時例外が生成されます。

また、列挙ループでフェッチを行うことは、次善の設計であるように思えます。むしろ、すべてのオブジェクトを取得してから、それらを反復処理して変更する必要があります。特別な述語構文を使用して、コレクション内の特定の属性を持つすべてのレコードを取得できます。

// make a collection of all the tags of the *SomeClass objects
NSArray *tags = [array objectForKeyPath:@"tag"];

// fetch all relevant records with this predicate
[NSPredicate predicateWithFormat:@"tag in %@", tags];
于 2013-09-22T09:36:26.870 に答える