我有一大堆模型可以 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 处理更新。
大致过程如下:
- 根据需要在模型中创建对象
- Controller 中有一个 setter,用于在方法变量中保存对象设置的当前状态
- 将新设置传递到服务器,但仅传递现有设置和新设置之间发生更改的设置(所有增量值)
- 如果调用通过,则更新模型,如果失败,则通知用户而不执行任何操作
每个 Controller 中的代码都多了一点,但是通过动态比较当前值与新值并仅将已更改的值传递给服务器,我实现了相同的最终结果。
这使我能够根据更改的数量传递多个值之一,而无需一遍又一遍地调用通用服务器 API 方法来对 setter 和 getter 进行硬编码。
最终效果是,我保留了所有 KVC/KVO 通知,而不必担心绕过它或不对某些调用进行 KVC/KVO 更新,而不会对其他调用进行 KVC/KVO 更新。
关于objective-c - 当 KVO 从模型 setter 触发时,防止递归地重新输入observeValueForKeypath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3486666/