2

同期ソリューションの一部としてsync status、特定のクラスのすべてのオブジェクトに対して を使用します。そのオブジェクトの特定の (すべてではない) 属性が変更されるたびに、ステータスを更新したいと考えています。

私は4つのアプローチを検討しています:

  1. 同期する必要があるものを変更するたびに、コードでステータスを手動で設定します。これは最も明白ですが、最も面倒でエラーが発生しやすい方法でもあります (新しい機能を追加するときはいつでも、同期ステータスの更新も忘れずに追加する必要があります)。
  2. コア データ通知 (willSaveまたは など NSManagedObjectContextObjectsDidChangeNotification) を使用して追跡します。一見すると、これが最も適切に思えます。AppDelegate で通知にサインアップし、毎回ステータスを更新するだけです。しかし、変更を調べて、気になる属性が更新されたときにのみ同期ステータスを更新することは可能でしょうか? また、設定sync_status自体もこの通知を起動し、無限ループに陥りませんか? これにどのように対処しますか?
  3. 気になる属性のカスタムセッター。以前はこれを機能させるのに苦労したことがあり、最終的には標準のコア データ ゲッター/セッターをそのままにしておくことにしました。しかし、それが最適である場合、私は掘り下げます。
  4. KVO。私は以前にこのパターンを使用したことはありませんが、関心のある属性の変更の通知にサインアップして、そこにフラグを設定するのが最も簡単かもしれません. しかし、どこでこれを行うのでしょうか? クラスのすべてのオブジェクトを監視する必要があるため、同じオブジェクトで属性の KVO 通知を観察することは可能でしょうawakeFromInsertか? つまり、オブジェクトが作成されるたびに、すぐに同じオブジェクトが attributeA への変更をリッスンし、sync_status 起動時に独自のオブジェクトを設定しますか?

これらのアプローチのどれが私に最も役立つでしょうか? おそらく私はいくつかの他のアイデアを見逃していますか?

4

1 に答える 1

2

ステータス コードの手動設定

あなたが説明したまさにその理由から、おそらく悪い考えです。あらゆる種類のケースでこれを行う必要があります。あなたが常にアプリの開発者であるとは限りません。ある日、あなたや他の誰かがそれを忘れるでしょう。そうしなくても、一元化できる余分なコードがいたるところに得られます。

コア データ通知を使用して追跡します [...] また、sync_status 自体を設定してもこの通知が発生し、無限ループに陥りますか?

それはあなたがそれをどのように行うかによって異なります。NSManagedObjectContextDidSaveNotificationセカンダリを使用すると、リッスンが機能する可能性がありますNSManagedObjectContext。そうすれば、同期フラグを設定し、変更を保存し、観察していない別のコンテキストで保存しているため、ループを回避できます。

を使用NSManagedObjectContextObjectsDidChangeNotificationすることもできます。これは、オブジェクトのプロパティが変更されたときに通知されますが、保存はまだ実際には進行していません。ディクショナリを調べて、関心のあるuserInfoものが変更されているかどうかを確認し、変更されている場合はsync_statusフラグを設定します。フラグを設定すると新しい通知がトリガーされますが、それは気にしない通知になるため、ループを中断します。別のコンテキストを使用すると、ここでのループも防止されます。

気になる属性のカスタムセッター。

確かに機能しますが、関心のある属性の数によっては、同期ステータスを更新するためだけに多くのアクセサーが必要になる可能性があります。あなたが言及した4つのうち、これは私が使用するものです。

willSave関連するがより単純なアプローチは、管理対象オブジェクト クラスをオーバーライドすることです。これは、保存の直前に呼び出されます。に実装します

  1. [self changedValues]同期をトリガーする属性を探します。
  2. それらのいずれかが見つかった場合は、同期フラグを設定します。

この方法では、同期フラグをトリガーする属性の数に関係なく、エンティティごとに 1 つのカスタム メソッドしかありません。

KVO

動作するはずですが、カスタム セッターよりも正しく動作するのはおそらく直感的ではありません。

このようなことをしなければならないときは、同期情報をデータ ストアの外に置きました。をリッスンしNSManagedObjectContextDidSaveNotification、オブザーバー メソッドでは次のようにします。

  1. userInfo何が変わったのかを確認するために目を通します
  2. NSManagedObjectID同期が必要な各オブジェクトの取得
  3. オブジェクト ID を NSString に変換し、それらを別のファイルに保存されたリストに追加します。

同期が成功したら、オブジェクト ID リストをクリアします。

主に、同期フラグは実際のモデル データよりもメタデータであると考えていたため、モデルから除外しました。モデルに保持したい場合は、オーバーライドしますwillSave

于 2013-02-19T00:31:09.043 に答える