2016-05-18 8 views
2

ビューコントローラ内の管理対象オブジェクトへの参照を有効にしておくことは賢明ですか?Core Dataオブジェクトへの参照を回避するのは悪いですか?

私はCore Dataには比較的新しいので、最近別のコンテキストの管理オブジェクトを混在させることができないことを発見しました。コンテキストに属さないオブジェクトをリレーションシップに追加することはできません。

たとえば、古典的なEmployeeエンティティと、Employeeオブジェクトを強く参照しているEmployeeDetailsViewControllerがあるとします。

Employeeオブジェクトの代わりに従業員のIDを格納する必要がありますか?ドメインオブジェクトの代わりにIDを使って作業するのはむしろ不便なので、通常どのように行われているのか不思議でした。

+0

これは複雑な問題で、多くの解決策があります。安全な答えはオブジェクトではなく 'objectID'を保持することだと思います。 – Avi

+1

私はこの悪い習慣を考えていません。実際にはかなり一般的です(コアデータオブジェクトはメモリ不足の状況や使用されなくなったときにフォールトに変わると考えています)。しかし、あなたが採用するソリューションは、実際にはプロジェクトの要件に依存する必要があります。 –

+1

これはあなたの興味を引くでしょう[オブジェクトライフサイクルの管理](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreData/MO_Lifecycle.html#//apple_ref/doc/uid/TP40001075-CH31- SW1) – Sudo

答えて

3

コアデータの世界へようこそ!

まず、アプリケーション内に多くのNSManagedObjectContextインスタンスがあります。ユーザーインターフェイス全体がONEのコンテキストで実行されているはずです。それはあなたの関係の問題を解決します。

参照を保持することについては、他のスレッドからそのオブジェクトを削除する可能性がある場合には、を除き、を除いて問題はありません。バックグラウンドスレッド(ネットワーク操作など)から削除する状況がある場合、困難な状況に陥る可能性があるため、これらのオブジェクトに対する強力な参照を保持したくない可能性があります。

ある種の変更に別のコンテキストを設定することをお勧めします。サーバーから来るもの、そして例えばサーバーからのもの。ユーザーの変更(UIを通じて作成)?私は、アプリケーションの "同期オフラインの変更"種類の機能と別々にこれらの2つのタイプの変更を追跡する方法を把握しようとしているので、例えば、サーバーから来る変更は、ユーザーが同じオブジェクトを変更した場合に破棄される。 (どのような長いコメントを!)(あなたはまた、同期についての私の他の質問を見てみることができます)

をだから私は住んでルール:

  • もしUI。メインキューコンテキスト。例外なし
  • UIでない場合、プライベートキューコンテキスト。例外なし

私は通常、メインキューコンテキストの子として自分のプライベートキューコンテキストを持っており、コード量を削減し、対処する必要があります。

したがって、サーバーの同期はUIではなく、プライベートの子コンテキストに対して実行する必要があります。

詳細については、MVC-Nの話をご覧ください。

+0

ある種の変更に別のコンテキストを持たせることをお勧めします。サーバーから来るもの、そして例えばサーバーからのもの。ユーザーの変更(UIを通じて作成)?私は、アプリケーションの "同期オフラインの変更"種類の機能と別々にこれらの2つのタイプの変更を追跡する方法を把握しようとしているので、例えば、サーバーから来る変更は、ユーザーが同じオブジェクトを変更した場合に破棄される。 (あなたはまた、私の他の質問の同期について見てみることができます)(どのような長いコメント!) – iosdude

+0

答えのあなたの長い質問の更新への簡単な答え:) –

1

オブジェクトを保存していることを忘れないでください。大丈夫です。
私はほとんどのアプリでこれが好きです。最初に選択したメインユーザがrootControllerの中に保存されているので、プログラムの使用中に変更されないので、CoreDataへの呼び出しが多すぎることはありません。

エンティティがアプリ内で変更された場合は、保存したオブジェクトをCoreDataから更新する必要があります。

+0

最後のステートメントは無関係です。オブジェクトを再フォールトし続ける必要があるが、一旦ロードされると標準プロパティを使用し、コアデータプロパティへの直接的な変数アクセスを取得しないと、効率が低下するのは当然です。 – Avi

関連する問題