NSFetchRequestを実行して、管理対象オブジェクト(具体的にはXMPPUserCoreDataStorageObjects)の配列を取得するメソッドがあります。配列がperformUserFetchによって返される前にオブジェクトは正しくフォールトし、すべてのdisplayNamesを出力できますが、配列をprintUserInfoに返すと、オブジェクトはフォールト状態になります。これは、CoreDataがもたらさないことを除いて問題にはなりません。それらを取り戻します!
- (NSArray*)performUserFetch
{
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];
[context setPersistentStoreCoordinator:[xmppRosterStorage persistentStoreCoordinator]];
[context setUndoManager:nil];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"XMPPUserCoreDataStorageObject" inManagedObjectContext:context];
NSSortDescriptor *sd1 = [[NSSortDescriptor alloc] initWithKey:@"sectionNum" ascending:YES];
NSSortDescriptor *sd2 = [[NSSortDescriptor alloc] initWithKey:@"displayName" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sd1, sd2, nil];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entity];
[fetchRequest setSortDescriptors:sortDescriptors];
[fetchRequest setReturnsObjectsAsFaults:NO];
NSError *err;
NSArray *result = [context executeFetchRequest:fetchRequest error:&err];
return result;
}
- (void)printUserInfo
{
NSArray *result = [self performUserFetch];
for(XMPPUserCoreDataStorageObject *user in result)
{
NSString *dn = user.displayName;
NSLog(@"Display name = %@", dn);
}
NSLog(@"%@",result);
}
私は5秒ごとにprintUserInfoを呼び出し、performUserFetchで問題がなければ結果配列を呼び出しますが、printUserInfoですべてがポットに入れられ、配列内のすべての要素がメモリから削除されました。それは問題ありませんが、user.displayNameを呼び出すと、障害が解決されないため、dnの値はnullになり、ユーザーの説明は次のようになります。
"<XMPPUserCoreDataStorageObject: 0x10219fd60> (entity: XMPPUserCoreDataStorageObject; id: 0x1021a3390 <x-coredata://324B9E93-BAD1-42B4-B7DB-2A62CA69BA13/XMPPUserCoreDataStorageObject/p127> ; data: <fault>)"
誰か助けてもらえますか?
(情報:10.7 SDK、printUserInfoは5秒ごとに呼び出され、ARCで実行されます)