2016-06-02 4 views
1

バックグラウンドのコンテキストでしばらくコアデータを使用していて、バックグラウンドからメインコンテキストにマージするために誰もがなぜNSManagedObjectContextDidSaveNotificationを使用するように助言するのだろうと思っていました。私は、1つのNSPersistentStoreCoordinator、主なコンテキストと背景のコンテキストを持つテストプロジェクトを作成しました。NSManagedObjectContextDidSaveNotificationは役に立ちませんか?

- (NSManagedObjectContext *)managedObjectContext { 

if (_managedObjectContext != nil) { 
    return _managedObjectContext; 
} 

NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
if (coordinator != nil) { 
    _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 
    [_managedObjectContext setPersistentStoreCoordinator:coordinator]; 
} 

return _managedObjectContext; 
} 



- (NSManagedObjectContext *)backgroundContext { 
if (_backgroundContext != nil) { 
    return _backgroundContext; 
} 
_backgroundContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
_backgroundContext.persistentStoreCoordinator = self.persistentStoreCoordinator; 

return _backgroundContext; 
} 

は今まで、私はこのような保存通知を聞いているだろう:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(mergeChanges:) 
              name:NSManagedObjectContextDidSaveNotification 
              object:self.backgroundContext]; 

しかし、私が実現私はそれからマージあれば、それは問題ではありません、ここでinitalisationのコード断片でありますお知らせ。私はどちらかのコンテキストを編集して保存することができ、もう1つは数秒後にマージされます。

So.私の質問、なぜ私はNSManagedObjectContextDidSaveNotificationが必要でしょうか?

+0

[コアデータの並行性](http://code.tutsplus.com/tutorials/core-data-from-scratch-concurrency--cms-22131) –

+0

通知を処理せずにマージしますが、それは本当に運がいいだけです。通知が行うことは、マージする他のコンテキストが変更を知ることができるようにすることです。これは、コンテクストが物をキャッシュするために重要です。 – Avi

+0

私のすべてのテストでは、ist自体がマージされていました。しかし、私はその通知を使用してマージする必要がある場合、すべてのサンプルは、バックグラウンドからメインコンテキストにマージなぜですか?メインコンテキストを保存するときに、逆にマージする必要はありませんか? –

答えて

1

あなたのコンテキストは関連していません。これらは、両方とも同じ永続ストアコーディネータに接続されたルートコンテキストです。

永続ストアへの変更は自動的に(あなたがNSManagedObjectContextDidSaveNotification通知を処理する必要がない理由である。)それに関連付けられたルートコンテキストにプッシュされ、より複雑な文脈の祖先を扱うとき

NSManagedObjectContextDidSaveNotificationが有用です中レベルコンテキストは、変更されたときにすべての子に自動的に通知しないためです。

例として、カドミウム(https://github.com/jmfieldman/Cadmium)のアーキテクチャ図を参照してください。バックグラウンドの子コンテキストがライターコンテキストに保存するとき、メインコンテキストはメインスレッドのNSManagedObjectContextDidSaveNotificationを処理して更新を組み込む必要があります。

+0

これが正しければ、NSManagedObjectContextDidSaveNotificationを使用して共有永続ストアコーディネータの設計が主およびプライベートコンテキスト間の変更を手動でマージする理由は何ですか?これらの管理されたオブジェクトコンテキストのいずれかを保存すると、共有コーディネータとバッキングストアファイルに変更が反映されます。保存後に各コンテキストからの変更をストアで利用できますが、他のコンテキスト。" https://www.bignerdranch.com/blog/introducing-the-big-nerd-ranch-core-data-stack/ –

関連する問題