私は現在、CoreData に大きく依存し、常に情報を永続化する iOS アプリケーションを開発しています。
MagicalRecord の助けを借りて、saveInBackgroundWithBlock 関数を使用してバックグラウンド保存を設定しました。
私が抱えている問題は、NSFetchRequest を「setReturnsObjectsAsFaults: NO」に設定した場合でも、このブロック内でフェッチされたものは常にエラーのあるオブジェクトを返すことです。
「MR_defaultContext」を使用してメイン スレッドからフェッチして同じテストを実行しましたが、これらのオブジェクトもエラーとして返されます。
これらのオブジェクトが障害オブジェクトとして返されないようにする唯一の方法は、「MR_rootSavingContext」を使用してストアからオブジェクトをフェッチすることです。
これについての奇妙なことは、「setReturnsObjectsAsFaults: NO」を設定していて、オブジェクトがまだ障害のあるオブジェクトとして返されることです。
フォルトを解消する必要がある理由は、どのデータを更新する必要があるかを正確に把握しており、すべてのオブジェクトでフォルトを発生させるとパフォーマンスが大幅に低下しますが、これらのフォルトをバッチ処理するとはるかに高速になります。
フェッチ要求を設定する方法に関するサンプル コードを以下に示します。
[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext) {
UserData *newUser = [UserData MR_findFirstByAttribute:@"index" withValue:[NSNumber numberWithInteger:currentUserIndex] inContext:localContext];
NSFetchRequest *documentsRequest = [DocumentData MR_requestAllWhere:@"user" isEqualTo:newUser inContext:localContext];
[documentsRequest setReturnsObjectsAsFaults:NO];
NSArray *fetchedDocuments = [localContext executeFetchRequest:documentsRequest error:nil];
// Fetched data is manipulated here, but the above fetchedDocuments are all faulted, and as a result really slow to update here
} completion:^{
NSLog(@"Finished saving documents");
}
];
アップデート: