サービスからデータを取得し、CoreData経由でレコードをデータベースに挿入するなど、長時間実行するタスクを実行するためにバックグラウンドスレッドを使用しています。多くの回答がここに示唆しているように、私はNSManagedObjectContextDidSaveNotification
通知を守っています。私はこれらの2つの方法を使用しています。 mergeChangesメソッドでは、通知オブジェクトに挿入が表示されますが、両方のメソッドが完了すると、メインMOCの表示はバックグラウンドスレッドの前にのみ変更されます。バックグラウンドスレッドからの新しい変更が反映されないのはなぜですか?私は何が欠けていますか?あなたがNSManagedObjectContextDidSaveNotification
を登録mergeChangesFromContextDidSaveNotificationの使用:saveNotificationメインスレッドで変更が表示されない
- (void) registerContextDidSaveNotificationForManagedObjectContext: (NSManagedObjectContext*) moc {
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self
selector:@selector(mergeChanges:)
name:NSManagedObjectContextDidSaveNotification
object:moc];
}
- (void)mergeChanges:(NSNotification *)notification {
//AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *mainContext = self.managedObjectContext;
// Merge changes into the main context on the main thread
[mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
withObject:notification
waitUntilDone:YES];
}
ありがとうございましたJohnMa、 これらは同じスレッドにあります。今すぐViewDidAppearにあります。 - (void)viewDidAppear:(BOOL)animated { [self registerContextDidSaveNotificationForManagedObjectContext:self.syncManagedObjectContext]; [self getFullData]; } –
JohnMaさん、ありがとうございました。 彼らは同じスレッドに属していました。今すぐViewDidAppearにあります。 - (void)viewDidAppear:(BOOL)animated { [self registerContextDidSaveNotificationForManagedObjectContext:self.syncManagedObjectContext]; [self getFullData]; } これはメインのUIスレッドです。次に、getFullDataメソッドは新しいスレッドを作成し、データを挿入します。 mergeChangesメソッドの終わりに私はmainContext.RegisteredObjectsを調べました。私は新しく挿入されたデータを見ることができますが、mainContext.InsertedObjectsは空です。私のデータがそこにあるかどうかはわかりません。どのように私はMOCオブジェクトが何であるかをよく見ますか? –
JohnMa、それはちょうど私ができなかった –