itok's Lab

昔の開発ネタを記録として残してます

faulting とその解除

一つのオブジェクトを参照するために、それに関連するすべてのオブジェクトツリーを永続層から読み込んで構築するのは無駄が多い。そのため、Core Data では実際に参照された時だけ関連オブジェクトをメモリ上に配置する仕組みを取り入れている。これが faulting。用語として、fault 中のオブジェクトをメモリ上に配置することを fire fault という。

さて、fire の実施は自動的に行われるので、開発者はそれを意識する必要がないわけですが、もし明示的に fire を行いたい場合は、このメソッドを使います。

// NSManagedObject
-(void) willAccessValueForKey:(NSString*)key

key にアクセスしたい属性のキーを渡してもいいし、nil を渡せばすべての fault が解除されるみたい。

データベースから fetch して取り出したオブジェクト群にさらにフィルタをかける時なんかに有効かもね。

NSArray* objects = [context executeFetchRequest:request error:&error];
...
// オブジェクト群にまとめて fire fault
[objects makeObjectsPerformSelector:@selector(willAccessValueForKey:) withObject:nil];
NSArray* filteredObjects = [objects filteredArrayUsingPredicate:predicate];