- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
作为 Cocoa 和 Objective-C 的新手,我对 KVC 和 KVO 有初步的了解。然而,关于 Cocoa 绑定(bind)(如标题为“Cocoa 绑定(bind)编程主题”的 Apple 文档中所述,请参阅图 8-10),我不清楚为什么他们描述使用 KVC 和 KVO,而看起来 KVO 就足够了。 KVO 的 ObserveValueForKeyPath:ofObject:change:context 可以提供旧值和新值,那么为什么需要 KVC 机制呢?注意,我看到了 KVO 如何解耦对象,但 KVC 也是如此。
Apple 给出的示例(图 8-10)描述了一个窗口,其中包含一个 slider 和一个文本输入控件(用于直观地表示并允许用户交互设置和查看“温度”)、一个 Controller 对象以及一个具有温度属性的模型对象。因此,换句话说,我的问题是为什么不在两个控件和 Controller 之间建立双向 KVO 关系(每个控件都作为观察者注册到另一个),以及在模型对象和 Controller 之间建立双向 KVO 关系?为什么需要KVC?
最佳答案
冗长的文档让您感到困惑。
这一切都是为了代码可重用性。
(1) 提供声明和管理属性的标准方法。(您可以使用 ivars、setter 和 getter 以旧方式手动完成此操作,但属性合成免费为您提供)
除非键值对遵循约定,否则您无法可靠地观察它们。惯例是KVC。接下来是 KVC 合规性。
(2) 为对象提供一种高度可重用且通用的方式来接收有关另一个对象中的属性更改的通知。这就是 KVO。KVO 能够根据首先符合 KVC 的属性更改对通知进行通用编码。
(3) 绑定(bind)和核心数据。这两种技术都基于 KVC 和 KVO 构建,以使这一切以尽可能通用的方式工作。
它在概念上也与 Active Record 和 Ruby on Rails 等 ORM 非常相似。魔法从 KVC 开始。KVC 实现了简单的 KVO 机制。KVO + KVC 使绑定(bind)和核心数据变得可能且简单。它们还提供了大量的语法糖和古怪的便利。您可以将 KVC 兼容对象的接口(interface)视为字典或数组。然后所有的模式都会就位。
您还可以拥有其他双向观察者模式。委托(delegate)(将彼此设置为或共享委托(delegate))和通知(通过 NSNotification),甚至只是简单地向其他对象发送消息(如果这是您的模式,则可能是紧密耦合,导致创建这些其他模式)这些并没有错,但需要一些权衡。
通知有时可能是意大利面条式代码。与所有回调一样,有时您最终会得到类似 goto 的结果。然而,它不一定与 KVO 等特定对象的特定属性紧密耦合。它只是在等待一个可能非常笼统的通知,其中可能包含很多不同的内容。然而,就其本质而言,通知往往更具体于用例,并且易于应用于自定义场景。
KVO 作为一种特定技术是基于 KVC 约定构建的,没有它们就无法工作。它使一些非常基本、常见的样板代码和紧密耦合更容易创建。
关于cocoa - 为什么 Cocoa 绑定(bind)同时使用 KVC 和 KVO 而不仅仅是 KVC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17202898/
我在我的代码中使用了 kvc。 [self addObserver:self forKeyPath:@"type" options:NSKeyValueObservingOptionNew |
@interface MyClass: NSObject @property NSArray *arr; @end @inplementation MyClass - (instancetype) i
作为 Cocoa 和 Objective-C 的新手,我对 KVC 和 KVO 有初步的了解。然而,关于 Cocoa 绑定(bind)(如标题为“Cocoa 绑定(bind)编程主题”的 Apple
我有一组从核心数据中选择的对象。我需要从这组对象子集中选择与条件相对应的对象。怎么做? 最佳答案 如果我没理解错的话,您想根据数组中某些对象满足的条件来过滤数组吗? 您可以通过使用 NSPredica
我创建类: @interface KVOGame : NSObject @property (nonatomic, strong) NSString *name; @property (nonatom
我有一个可绑定(bind)协议(protocol) protocol Bindable: class { associatedtype ObjectType: Any associat
以下哪个更快,为什么? CGFloat sum = 0; for (UIView *v in self.subviews) sum += v.frame.size.height; 或 CGFl
如果接收器类符合 NSKeyValueProtocol,则可以选择走很远的路: [myInstance setValue:[NSNumber numberWithInt:2] forKey:@"int
我经常需要检索属于 Set 的第一个对象。 (使用该对象作为该集合的代表。) 我设想了一个集合对象运算符,类似于 @unionOfObjects 但是很明显 @firstObject 是否可以创建这样
我正在尝试让我的头脑专注于“键值编码”。 Apple's docs say: This document describes the NSKeyValueCoding informal protoco
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
我正在尝试向我的可重用单元添加一个观察者,问题是它添加了多个观察者。所以我想知道是否有什么办法可以解决这个问题,因为我真的需要这个观察者。 var player: AVPlayer? var post
我想解析 XML 以填充符合 KVC 的对象,但是,我的解析器非常笨,它只是从 XML 属性/标签组装 NSStrings 并尝试通过 KVC 设置它们。 这适用于实际的字符串和数字(我相信),但
我正在尝试观察收藏笔记。这是代码: -(void) registerNotesHeaderViewChangeNotification { [self.selectedVegetableGar
我使用此代码通过我的可变数组订阅事件: [RACObserve(self, marray) subscribeNext:^.... 我是 RAC 的新手,我不明白为什么,例如,如果我使用: NSMut
我有例如我的 NSArray 中有 5 个 MyFile 对象。这 5 个对象中的每一个都具有属性 path。 MyFile *myFile ...; NSString path = myMyFile
这是代码: NSNumber *taskId = [[self.taskList objectAtIndex:indexPath.row] valueForKey:@"identity"]; N
有一个例子如下: enum Gender{ case male case female } class Person:NSObject{ var name: String?
我正在尝试了解 Swift 4 的最新添加 - better KVC .在 Playground 上放这个简单的东西什么也打印不出来 class Foo { var name: String
我读过Marcus S. Zarra的iOS相关章节Core Data: Data Storage and Management for iOS, OS X, and iCloud (第 2 版)受益
我是一名优秀的程序员,十分优秀!