2

私には、変化を監視するモデルがたくさんあります。セッターがトリガーされると、モデル内のオブザーバーが呼び出され、そのモデル内でWebサーバーを呼び出して、Webサーバー内の情報を更新し、必要なデータが正しく含まれるようにします。

ただし、Webサーバーへの呼び出しで、接続の切断、サーバーのリセットなど、更新が許可されなかったというエラーをサーバーに返すことができます(たとえば、別のユーザーによって変更された他のパラメーターによって更新が妨げられた)。

切断されたデータストアの喜び...

selfKVOアクションを再トリガーせずに更新(つまりモデル)できる方法はありますか?

応答が返されたらオブザーバーをオフにすることもできますが、バックグラウンドサーバー要求の実行中に、同じオブジェクトに対する別のユーザーアクションが可能です。これにより、他の呼び出しが中断されます。

そもそも観測を行うために私がやろうとしていたことの説明と、完全なモデルのコード例については、こちらの投稿を参照してください。

私が電話をかけている部分は、次のようにオブザーバーになります。

-(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
  }
}

あなたたちはいつもいくつかの良いアドバイスをやってきたようです、そして私はあなたが持っているかもしれないどんな提案にもいつも感謝しています。

4

1 に答える 1

2

さて、私は別のタックを取ることになりました。更新を投稿するためにオブジェクトモデルに依存する代わりに、私はすべてを1レベル上げて、コントローラーに更新を処理させました。

基本的に、プロセスは次のとおりです。

  1. 必要に応じてモデルにオブジェクトを作成します
  2. オブジェクト設定の現在の状態をメソッド変数に保持するセッターをコントローラーに配置します
  3. 新しい設定をサーバーに渡しましたが、既存の設定と新しい設定の間で変更された設定のみ(すべてのデルタ値)
  4. 呼び出しが成功した場合はモデルを更新し、失敗した場合はユーザーに通知してそれ以上何もしません

各コントローラーのコードが少し増えましたが、現在の値を新しい値と動的に比較し、サーバーに変更された値のみを渡すことで、同じ最終結果を達成しました。

これにより、共通のサーバーAPIメソッドを何度も呼び出してセッターとゲッターをハードコーディングしなくても、変更された数に基づいて1つ以上の値を渡すことができます。

正味の効果は、すべてのKVC / KVO通知をバイパスしたり、一部の呼び出しでKVC / KVOの更新を行わなかったり、他の呼び出しでは行わなかったりすることを心配せずに保持することでした。

于 2010-09-23T00:43:56.907 に答える