KVOがモデルセッターから解雇されたときに再帰的にobvalueforkeypathの再入力を防ぐ
-
28-09-2019 - |
質問
私は自分自身が変化を見るのを見る多くのモデルを持っています。セッターがトリガーされると、モデルのオブザーバーが呼び出され、そのモデル内でWebサーバーに呼び出してWebサーバーで情報を更新して、正しくデータが必要です。
ただし、Webサーバーへの呼び出しでは、接続がドロップされ、サーバーリセットなどのエラーを返すことができます。アップデートが許可されていないというサーバーまで(たとえば、別のユーザーによって変更された他のパラメーターが更新を妨げました)。
ああ、切断されたデータストアの喜び...
更新できる方法はありますか self
(つまり、モデル)kvoアクションを再トリガーせずに?
応答を取り戻すと、オブザーバーをオフにすることができますが、バックグラウンドサーバーの要求が実行されている間、同じオブジェクトに対する別のユーザーアクションが可能です。これにより、他の呼び出しが破損します。
投稿を参照してください ここ そもそも観察を起こすために私がやろうとしていたことの説明と、完全なモデルのコード例。
私が電話をかけている部分は、次のようにオブザーバーにあります:
-(void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
if ([keyPath isEqual:@"firstName"]) {
if !([serverCall value:[change objectForKey:NSKeyValueChangeNewKey]
forKey:@"firstName"]) {
// Notify the user of the problem and somehow do a
// [self setFirstName:[change objectForKey:NSKeyValueChangeOldKey]]
// without firing off a KVO which would only loop this process
}
}
if ([keyPath isEqual:@"lastName"]) {
// Do whatever I need to do
}
}
皆さんはいつも良いアドバイスを受けているようで、私はあなたが持っているかもしれないどんな提案にもいつも感謝しています。
解決
さて、私は別のタックを取ることになりました。オブジェクトモデルに頼って更新を投稿する代わりに、すべてを1つのレベルに上げて、コントローラーが更新を処理させました。
基本的にプロセスは次のとおりでした:
- 必要に応じてモデル内にオブジェクトを作成します
- オブジェクト設定の電流状態をメソッド変数に保持しているセッターをコントローラーに持っています
- 新しい設定をサーバーまで渡しましたが、既存の設定と新しい設定(すべてのデルタ値)の間で変更された設定のみを渡しました。
- 通話が通過した場合、モデルを更新するか、失敗した場合はユーザーに通知し、それ以上何もしません
各コントローラーでもう少しコードであることがわかりましたが、現在の値を新しい値と動的に比較し、サーバーに変更したもののみを渡すだけで、同じネット結果が得られました。
これにより、ハードコードセッターとゲッターが共通のサーバー-APIメソッドを何度も呼び出すことなく、数が変更されずに変更された数に基づいて、さらに値の1つを渡すことができます。
最終的な効果は、KVC/KVO通知をすべてバイパスすることを心配せずに、または他の通話ではなくいくつかのコールでKVC/KVOの更新を実行しないことを維持することでした。