2016-09-06 7 views
15

私のアプリケーションでは、NSFetchResultControllerを使用して、Core DataオブジェクトをUITableViewにロードしています。 このFRCに関連付けられたフェッチ要求は、NSPersistentContainer(iOS10)で使用可能な新しいviewContextプロパティを使用します。コアデータiOS10:NSFetchResultControllerでnewBackgroundContext()からの更新を受け取っていないviewContext

セルを選択すると、Core Dataオブジェクトを新しいViewControllerに渡します。この新しいVCは引き続きviewContextを使用します。 このViewControllerから、私たちはモーダルに表示されたViewControllerからCore Dataオブジェクトを更新できます。これを行うには、モーダルViewControllerにnewBackgroundContext()を使用します。 Core Dataオブジェクトの更新は問題なく保存できます。

問題は、バックグラウンドコンテキストからFRCが更新コアデータオブジェクトで自動的に更新されないことです。 viewContextが受信しておらず、Core Dataオブジェクトの更新を処理していないかのようです。

viewContext(app wide)にautomaticallyMergesChangesFromParentをtrueに設定した場合、FRCはバックグラウンドコンテキストを保存すると、更新されたCore Dataオブジェクトを取得します。私の理解から、viewContextはデータのマージを自動的に管理する必要があります。このドキュメントでは、次のようにviewContextについて説明しています。"このコンテキストは世代別に構成され、他のコンテキストからの保存通知を自動的に消費するように構成されています。

NSFetchResultControllerを使用してさまざまなコンテキストを処理する方法を明確にすることはできますか?

おかげで、 アクセル

答えて

5

私が直接これに遭遇していないが、newBackgroundContextは任意のため、viewContext下重ね、実際にのみviewContextを更新する新しい文脈から保存した場合、あなたの問題が奇数として私を打ちます永続的なストア(これは正しく実行されていると言います)への変更を取得するために、独自のsaveを実行する必要があります。

このメソッド(newBackgroundContext())を呼び出すと、永続コンテナはconcurrencyTypeをprivateQueueConcurrencyTypeに設定して新しいNSManagedObjectContextを作成して返すようになります。この新しいコンテキストは、直接NSPersistentStoreCoordinatorに関連付けられ、になり、NSManagedObjectContextDidSaveブロードキャストを自動的に使用するように設定されます。

したがって、viewContextとの親子関係にはなりません。このガイダンスに基づいて、古いコンテキストの変更が新しいコンテキストに通知されるようになっているようですが、その逆ではないため、新しいコンテキストが変更されたときにviewContextを更新する必要があります。あなたのコードでそれを追跡するか、おそらくNSManagedObjectsContext内の変更通知の1つを使用してアクションをトリガーします。

+2

ドキュメント(NSManagedObjectContext.h中).automaticallyMergesChangesFromParent用は言う:」コンテキストが自動的にそのコーディネータに保存された変更をマージするかどうかを判定または親のコンテキスト。コンテキストが非現在のクエリ生成に固定されている場合、このプロパティをYESに設定することはサポートされていません "というように、親が"店舗コーディネータ "の対象ではないケースのように見えます。.viewCoordinatorと.newBackgroundContextは同じストアコーディネータ –

19

正しい動作が表示されています。 newBackgroundContext()によって作成されたものを含め、他のコンテキストからの変更を自動的に取得するには、automaticallyMergesChangesFromParenttrueに設定する必要があります。

私は、ドキュメントがその点で混乱していることに同意します。"...と他のコンテキストからの保存通知を自動的に消費することに同意します。「親がこのようなviewContextに設定する必要がありますから

+2

私のために働いていません – Ramis

+1

私のために働きます。ありがとうございました! – glebus

+2

私のために働いていません!!! – Satyam

4

自動的に変更をマージ:

persistentContainer.viewContext.automaticallyMergesChangesFromParent = true 
関連する問題