【问题标题】:when to use KVO?何时使用 KVO?
【发布时间】:2013-06-05 03:37:54
【问题描述】:

我已经阅读了很多关于 KVO 的文档,但我仍然对何时使用它感到困惑。

如果objA想监控objB的某个属性,像这样:

self.objB = [[ObjB alloc] init];
[self.objB addObserver:self
            forKeyPath:@"address"
               options:0
               context:nil];

所以如果objB的属性发生变化,而只能由self改变,为什么不干脆这样做:

self.objB.property = @"newValue";
[self doSomethingBasedOnNewValueOfObjBnewProperty];

而不是

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context

{
    if(keyPath == @"address") {
        [self doSomethingBasedOnNewValueOfObjBnewProperty];
    }
}

与单例一起使用时可能很有用,例如self.objB = [ObjB sharedInstance],其中属性可能会被其他对象更改。这是唯一的用例吗?

【问题讨论】:

    标签: objective-c key-value-observing


    【解决方案1】:

    并非所有类的所有实例都只能由同一个实例创建和编辑(这实际上是您的示例所表明的)。

    KVO 是一种通用方法,通过它一个实例可以观察另一个实例的变化并接收已发生情况的通知。这些更改可以从任何地方触发。

    假设您在项目中添加了第 3 方库。你不知道它是如何实现的。调用一种方法可能会更改库类实例中的多个不同属性。 KVO 为您提供了一种简单的方法来监控这些变化并做出反应。

    KVO 还提供“依赖键”,它允许您配置键之间的关系,因此您可以说“此属性的值取决于另一个对象中的一个或多个其他属性的值”,KVO 会告诉您何时发生。这在托管对象子类中可能特别有用,例如,如果您有一个临时键保存某个持久键的缓存值,并且每当持久值更改时都需要更新缓存...

    【讨论】:

      【解决方案2】:

      Wain 的回答是完美的。我想通过说明一些 KVO 可能用途的示例来做出贡献。

      KVO 在某些对象“比如一个或多个视图控制器”需要监视许多对象的变化的情况下很有用。

      例如,FPS 游戏有一些视图,一个显示玩家之间的互动,一个角落的视图显示当前玩家得分和健康;当点击按钮或游戏暂停时显示玩家得分的菜单。 如果当前玩家击中或被其他玩家击中,您需要更新主视图,通过显示成功击中或显示该玩家受伤的迹象,分数和健康视图需要更新它的数据和玩家的分数视图需要更新。现在假设您需要添加一个新的控制器对象,通过监控玩家的得分和击杀次数来监控玩家的成就。该对象还需要收到有关玩家发生任何事件的通知。

      在这种情况下,许多对象需要监视许多其他对象“当前玩家和其他玩家”的变化。 KVO 为您提供了一个简单的工具来实现这一点无需编写代码来处理通知注册和实际通知。想一想您将如何从头开始实施它才能注意到差异。


      在另一个例子中,我通常倾向于为 Web 服务检索的某些数据创建一个单格加载器。在这种情况下,应用程序的许多部分都需要一些数据。

      例如,您想开发一个由向用户展示可用商品的商店制作的应用。此应用需要向用户显示一个显示所有商品的表格视图、一个显示特定类别的商品的视图、另一个显示特价商品的视图,另一个显示特定项目的详细信息和可用数量的视图。 现在假设应用需要每隔几个小时或在用户请求刷新时刷新数据。该加载器类可以自己处理刷新操作,并且视图控制器可以注册到相关键。这样,刷新在一个对象中处理,其他对象可以只专注于它们的视图处理逻辑。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-20
        • 2012-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多