2017-05-29 12 views
0

私の初期画面でNSManagedオブジェクトのNSFetchRequestを作成しています。コアデータからオブジェクトを削除してビューコントローラを切り替えるときにクラッシュする

私のタブバーコントローラ内の別のビューコントローラへ
  • スイッチ
  • は、これも一般的な管理対象オブジェクトを削除し、同じ管理対象オブジェクトタイプで要求をフェッチします:私はとき、私は時々シナリオでクラッシュを持っています私の最初のVCのfetchrequestに現れます。 VCにはテーブルビューが含まれています。
  • 私はこれらの返されたオブジェクトを管理するためにNSFetchResutltsControllerを使用していない最初のVCに管理コンテキスト
  • トグルを保存し、データに

をリロードします。クラッシュは、私のテーブルビューがリロードされたときに発生します。私は別の要求をして、削除されたオブジェクトが返されないことを期待しますが、そうします。セルが削除されたオブジェクトのプロパティを読み取ろうとすると、uninitializedが読み込まれ、クラッシュします。これは、2つのVC間をトグルするときに約5回発生します。私はすべてのCoreData関数でperformAndWaitを使用しています。

2つの画面間で管理対象オブジェクトの関係を切り離す方法はありますか?そうでない場合は、最初のVCでフェッチ要求を取得し、2番目のVCで削除されたオブジェクトを返さず、同期させておくことができます。

+0

クラッシュメッセージとは何ですか?どのクラッシュメッセージがクラッシュしますか? – Paulw11

+0

ここにクラッシュログを追加できますか? –

答えて

1

NSManagedObjectは他のオブジェクトと似ていません。情報自体は含まれていません。コンテキストへのポインタとobjectIDを持ちます。プロパティーにアクセスすると、要求をコンテキストに転送して、必要な情報を取得します。エンティティがコンテキストから削除されると、managedObjectは動作を停止し、クラッシュします。これは一般的にmanagedObjectsへのポインタを保持しておき、1つのオブジェクトに対してのみfetchedResultsControllerを使って常にアクセスし、その直後にmanagedObjectsの結果が破棄された場合にフェッチするのは悪い習慣だと思います。

あなたはあなたの質問で示唆した2つの解決策があります。 managedObjectから値をコピーするか、fetchedResultsControllerを使用することができます。値をコピーすると、エンティティが削除された後でも値が正常に表示されます。 fetchedResultsControllerを使用すると、fetchedObjectsプロパティに削除されたオブジェクトが含まれることはなくなり、オブジェクトは削除された後にアクセスできなくなります。

fetchedResultsControllerの使用をお勧めします。あなたはそれを恐れる必要はありません。大きなオーバーヘッドではなく、オブジェクトを1つしかフェッチしていない場合でも使用するのが妥当です。

+0

詳細な回答Jonさんありがとうございます。 2つの画面の間にfetchResultsControllerを実装します。 – yamski