objective-c - 当 KVO 从模型 setter 触发时,防止递归地重新输入observeValueForKeypath

标签 objective-c cocoa models key-value-observing getter-setter

我有一大堆模型可以 self 观察变化。当触发 setter 时,模型中的观察者被调用,在该模型中,我调用 Web 服务器并更新 Web 服务器中的信息,以便它正确地拥有应有的数据。

但是,在我对网络服务器的调用中,我可以得到一个错误,从连接断开、服务器重置等到服务器说不允许更新(例如,另一个用户更改的一些其他参数阻止了更新) )。

哦,断开连接的数据存储的乐趣......

有什么方法可以更新self(即模型)而不重新触发 KVO 操作?

当我收到响应时,我可以关闭观察者,但是在执行后台服务器请求时,可能会对同一对象执行另一个用户操作。这将中断另一个调用。

查看帖子here了解我为了首先进行观察而尝试做的事情以及完整模型的代码示例。

我进行调用的部分将在观察者中,如下所示:

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

你们似乎总是能提出一些好的建议,我总是很感激你们提出的任何建议。

最佳答案

好吧,我最终采取了不同的策略。我没有依赖对象模型来发布更新,而是将所有内容提升一级并让 Controller 处理更新。

大致过程如下:

  1. 根据需要在模型中创建对象
  2. Controller 中有一个 setter,用于在方法变量中保存对象设置的当前状态
  3. 将新设置传递到服务器,但仅传递现有设置和新设置之间发生更改的设置(所有增量值)
  4. 如果调用通过,则更新模型,如果失败,则通知用户而不执行任何操作

每个 Controller 中的代码都多了一点,但是通过动态比较当前值与新值并仅将已更改的值传递给服务器,我实现了相同的最终结果。

这使我能够根据更改的数量传递多个值之一,而无需一遍又一遍地调用通用服务器 API 方法来对 setter 和 getter 进行硬编码。

最终效果是,我保留了所有 KVC/KVO 通知,而不必担心绕过它或不对某些调用进行 KVC/KVO 更新,而不会对其他调用进行 KVC/KVO 更新。

关于objective-c - 当 KVO 从模型 setter 触发时,防止递归地重新输入observeValueForKeypath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3486666/

相关文章:

objective-c - 工作表从 View 中弹出

objective-c - 字符串中的 URL 给出 null

objective-c - 核心数据中的多个反向关系

database - Yii2 + Redis 作为数据库

Laravel 指定关系的外键

iphone - Objective-C 包级属性

ios - SKAction序列临时延迟(初始延迟?)

ios - 下一个按钮图像数组xcode

ios - 相互连接超过 3 个 ios 设备

mysql - 使用 node-mysql 编写 MySQL Node.js 模型