2013-12-19 10 views
5

サービスからデータを取得し、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]; 
} 

答えて

5

スレッドは、あなたが[mainContext mergeChangesFromContextDidSaveNotification: notification]を呼び出すスレッドにする必要があります。

例えば:あなたはスレッド登録NSManagedObjectContextDidSaveNotificationスレッドB.で何か変化が、その後、あなたが通知を受信したとき、あなたのように通知を渡すので、しかし、これらの変更は、スレッドBに関連付けられている、あなたは、直接変更にアクセスすることはできませんこれらの変更をマージするにはmergeChangesFromContextDidSaveNotification:(スレッドAのコンテキストに送信する)の引数を使用します。

したがって、同じスレッドにあるかどうかを確認してください。

+0

ありがとうございましたJohnMa、 これらは同じスレッドにあります。今すぐViewDidAppearにあります。 - (void)viewDidAppear:(BOOL)animated { [self registerContextDidSaveNotificationForManagedObjectContext:self.syncManagedObjectContext]; [self getFullData]; } –

+0

JohnMaさん、ありがとうございました。 彼らは同じスレッドに属していました。今すぐViewDidAppearにあります。 - (void)viewDidAppear:(BOOL)animated { [self registerContextDidSaveNotificationForManagedObjectContext:self.syncManagedObjectContext]; [self getFullData]; } これはメインのUIスレッドです。次に、getFullDataメソッドは新しいスレッドを作成し、データを挿入します。 mergeChangesメソッドの終わりに私はmainContext.RegisteredObjectsを調べました。私は新しく挿入されたデータを見ることができますが、mainContext.InsertedObjectsは空です。私のデータがそこにあるかどうかはわかりません。どのように私はMOCオブジェクトが何であるかをよく見ますか? –

+0

JohnMa、それはちょうど私ができなかった –

関連する問題