バックグラウンドスレッドを使用して、日付でソートされたレコードの一部をフェッチしています。IOSコアデータフェッチ要求 - ソート
UIスレッド(テーブルビュー)のレコードを削除するまで、すべてうまく動作します。
//this is done in the background thread
NSFetchRequest *frequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity"
inManagedObjectContext:self.managedObjectContext];
[frequest setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]
initWithKey:@"date"
ascending:NO];
NSArray *descriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[frequest setSortDescriptors:descriptors];
[frequest setFetchOffset:fetchOffset];
[frequest setFetchLimit:20];
[frequest setResultType:NSManagedObjectIDResultType];
NSError *fetchError;
NSMutableArray *mutableFetchResults = [[self.managedObjectContext executeFetchRequest:frequest
error:&fetchError] mutableCopy];
バックグラウンドスレッドがNSManagedObjectContextDidSaveNotificationのために登録し、次のセレクタ
//this is done in the background thread
-(void) didSavePersistenceStore:(NSNotification *)notification
{
[self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
}
に問題を行う:レコードを削除した後、後続のフェッチの結果はもう日付でソートされていません。
私には何が欠けていますか?
コードは正しいです。 IMHO、エラーはどこかにあるはずです。 – Mundi
通知はメインスレッド上で行われ、 'mergeChangesFromContextDidSaveNotification:'がメインスレッド上で実行されますが、これは正しいスレッドではありません。これが問題を引き起こしているのかどうかは考えられませんが、微妙なバグが発生する可能性があります。 –
mergeChangesFromContextDidSaveNotificationのターゲットは、バックグラウンドスレッドに関連付けられたManagedObjectContextです。この場合、どのスレッドがメッセージを呼び出すかは重要ですか? – Sammy