【问题标题】:When is KVC & KVO worth the trouble? Always?KVC 和 KVO 什么时候值得麻烦?总是?
【发布时间】:2013-05-04 16:48:05
【问题描述】:

它似乎是 Objective-C 的一个几乎新的超集,将点符号与指令混合在一起,例如:studentsInClassA.@union.studentsInClassB.pets(...) 和合规语法,例如:-replaceObjectIn<Key>AtIndex:withObject:。看起来 KVC 的很大一部分类似于简单的访问器方法,无论如何都可以合成。但是,我会说 KVObserving 似乎使 MVC 应用程序更容易。意见?

【问题讨论】:

    标签: objective-c model-view-controller syntax conventions kvc


    【解决方案1】:

    键值编码允许您查找任意嵌套的属性,其身份仅在运行时才知道。例如,KVC 不是person.name 的一个很好的替代品——它对于这样一个特定的任务来说是不必要的通用。但是假设我们在编写程序时不知道是否要查找名称、年龄或最喜欢的鞋品牌。我们经常在使用 NSTableView 数据源时遇到这种情况。我们可以编写一个大的、重复的条件来发送我们想要的消息,但是 KVC 使它变得简单:

    return [personController.selectedPerson valueForKeyPath:desiredAttribute];
    

    然后我们可以将desiredAttribute 设置为@"name"@"age"@"favoriteShoeBrand.name",即使在运行时我们只知道我们想要的属性,我们也会在不分支的情况下得到正确的值。

    这也很有用,因为类可以以特殊方式处理 KVC。例如,NSArray 做了一些非常好的事情。 [arrayOfPeople valueForKeyPath:@"name"] 不等同于 arrayOfPeople.name — 相反,它会将 keypath 传递给每个对象并使用执行结果创建一个新数组。因此,它的用途与许多其他语言中的地图功能大致相同。还有一些特殊的 KVC 运算符,例如 @distinctUnionOfArrays(它采用数组集合并将它们合并在一起,忽略重复项),这使得以这种方式对嵌套集合进行操作比其他方式更加简洁。

    对于 KVO,它只是一种在发生变化时获得通知的方式——例如,您可以在用户生日时将用户界面更新为新的年龄,而用户界面无需了解生日逻辑。如果这听起来对您有用,您可能会喜欢它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 2017-02-13
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多