2016-07-06 8 views
0

coredataのsubEntitiesをクリアする安全な方法を尋ねたいと思います。Coredata safe clear subEntities

私はこのような多対多の関係を持っています:Product *<->* Product。したがって、(sortPosition、groupName .....)の間にいくつかの特別な値を保持するために、subEntityを作成しなければなりません。

だから、これは次のようなものです:Product *<->1 ProductSubEntity 1<->*Product

私は、サーバーのAPIから製品をダウンロードすると、サーバーの結果に対応して正しく更新する最も簡単な方法は次のとおりです。

  1. は、すべての子関係([self removeProductSubEntities:self.subEntities])を取り外します。
  2. サーバーの結果からサブを追加します。

結果:coredataには多くのsubEntity(製品との関係はありません)があります。これはCRUDのときにストレージ/メモリ/ cpuがかかることがありますか?しかし、私は実際にsubEntityを削除することはできません(その場合は、viewControllerのObjectとしてどこかの参照を保持していて、削除されたオブジェクトへのアクセスがクラッシュする可能性があります)。

質問:私は、これらのサブエンティティをクリアするにはどうすればよい

は(時々発生する可能性があります)の場合:

  1. 任意の製品とは関係。
  2. どこからでも実際の参照はありません(任意のviewControllerまたはオブジェクト)???

P/S:アプリを終了するときにバッチ削除を実装すると考えています。それは安全な解決策と考えることができますか?

答えて

1

これはデータストアの問題ではなく、UIの更新に関する問題であると私は考えています。必要がなくなったときにオブジェクトをデータストアから削除し、それに応じてUIを更新する必要があります。

言及していない1つのものは再利用です。ダウンロードしたものが既存のアイテムのアップデートである可能性があります。見つけて更新することができますし、人生は簡単です。あなたのUIは変更を反映するために更新されない可能性があり、管理対象オブジェクトを更新する必要があるかもしれませんが、おそらくこの場合は以下のすべてが適用されます。

UIの更新については、通常、データストアに変更があることを確認することをお勧めします。通常は、NSFetchedResultsControllerです。あなたがこれをやっているならば、あなたのUIは自動的にその変更で更新されます。

エンティティインスタンスを明示的に渡す場合は、更新を明示的にトリガする方法があり、その動作はUIによって異なります。一般的に言えば、UINotificationを投稿すると、データストアが変更され、データオブジェクトの再検証が必要であることがシステムに伝えられます。 UIの場合、死んだオブジェクトをユーザーに表示すべきではありません。また、クラッシュを避けるために削除しないことについて話している場所では、無効なオブジェクトを更新して静かに更新は保存されません。通知が受信されると、(一部の)コントローラをスタックから外したり、新しいデータが表示されるようにデータストアに再クエリしたりすることができます。

何らかの理由で上記を実行したくない場合は、はいの場合、nil関係を持つすべてのエンティティを照会して一括削除できます。これは、データの読み込みと同じようにバックグラウンドのスレッドで行う必要があります。私は非常に多くのビューコントローラがロードされていないので、すべての有効な参照のみを持つ必要がありますので、閉じるのではなくアプリケーションの読み込みで行うことをお勧めします。 ..)。