2

我有一大堆模型可以观察自己的变化。当触发 setter 时,模型中的观察者会被调用,并且在该模型中,我调用 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
  }
}

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

4

1 回答 1

2

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

基本上该过程如下:

  1. 需要时在模型中创建对象
  2. 在控制器中有一个设置器,它在方法变量中保存对象设置的当前状态
  3. 将新设置传递给服务器,但仅限于在现有设置和新设置之间更改的设置(所有增量值)
  4. 如果调用通过,更新模型,或者如果失败,通知用户并且什么都不做

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

这使我可以根据更改的数量传递多个值中的一个,而无需通过一次又一次地调用公共服务器 API 方法来硬编码 setter 和 getter。

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

于 2010-09-23T00:43:56.907 回答