Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Cocoa绑定同时使用KVC和KVO,而不仅仅是KVC?_Cocoa_Cocoa Bindings_Key Value Observing_Kvc - Fatal编程技术网

为什么Cocoa绑定同时使用KVC和KVO,而不仅仅是KVC?

为什么Cocoa绑定同时使用KVC和KVO,而不仅仅是KVC?,cocoa,cocoa-bindings,key-value-observing,kvc,Cocoa,Cocoa Bindings,Key Value Observing,Kvc,作为Cocoa和Objective-C的新手,我对KVC和KVO有初步的了解。然而,关于Cocoa绑定(如标题为“Cocoa绑定编程主题”的苹果文档中所述,见图8-10),我不清楚为什么它们同时使用KVC和KVO进行描述,而KVO似乎已经足够了。KVO的ObserveValueForKeyPath:ofObject:change:context可以提供新旧值,那么为什么需要KVC机制呢?注意,我看到了KVO如何解耦对象,但KVC也是如此 苹果给出的示例(图8-10)描述了一个窗口,其中包含一个滑

作为Cocoa和Objective-C的新手,我对KVC和KVO有初步的了解。然而,关于Cocoa绑定(如标题为“Cocoa绑定编程主题”的苹果文档中所述,见图8-10),我不清楚为什么它们同时使用KVC和KVO进行描述,而KVO似乎已经足够了。KVO的ObserveValueForKeyPath:ofObject:change:context可以提供新旧值,那么为什么需要KVC机制呢?注意,我看到了KVO如何解耦对象,但KVC也是如此


苹果给出的示例(图8-10)描述了一个窗口,其中包含一个滑块和一个文本输入控件,用于直观地表示并允许用户交互设置和查看“温度”、控制器对象和具有温度属性的模型对象。换句话说,我的问题是,为什么不在两个控件和控制器之间建立双向KVO关系(每个控件都注册为另一个作为观察者),以及在模型对象和控制器之间建立双向KVO关系?为什么需要KVC?

一些人在评论中尝试过,他是我的目标:

KVO基本上是建立在KVC之上的—当KVC兼容属性发生更改时,如果有观察者,KVO机器就会启动,根据需要构建信息字典,并将消息发送给观察者

如果他们的问题是为什么这样做,为什么不是另一个,那么这是一个不同的问题。KVO需要插入一些东西-您不能仅仅以简单的方式观察变量(内存位置)的更改[*]。具有setter和getter的属性是KVO之类的东西可以挂接的地方。属性遵循KVC模式,并且已经有了支持该模式的机制。。。但这并不意味着KVO必须依赖于KVC,其他实现策略无疑是可能的

一点也不


[*]在此上下文中,进入调试模式并部署观察点并不“简单”

冗长的文档让你感到困惑

所有这些都是关于代码可重用性的

(1) 提供声明和管理属性的标准方法。 (您可以使用ivar、setter和getter手动执行,但属性合成将免费提供给您)

除非遵循约定,否则无法可靠地观察键值对。 约定为KVC。接下来就是KVC兼容

(2) 为对象提供一种高度可重用和通用的方式,以接收有关另一个对象中属性更改的通知。这是KVO。 KVO能够根据首先符合KVC的属性的更改对通知进行一般性编码

(3) 绑定和核心数据。这两种技术都是基于KVC和KVO构建的,以使这一切尽可能通用

它在概念上也非常类似于activerecord和rubyonrails等ORMs。 魔法从KVC开始。 KVC支持简单的KVO机制。 KVO+KVC使绑定和核心数据成为可能和容易。 它们还提供了许多语法上的甜点和古怪的便利。 您可以将KVC兼容对象的接口视为字典或数组。 然后所有的模式都会就位

您仍然可以使用其他双向观察者模式。 委派(将彼此设置为委派或共享委派)和通知(通过NSNotification),甚至只是发送消息给其他对象(如果到处都是这种模式,则可能是紧密耦合,导致创建这些其他模式) 这些都没有错,但有一些权衡

通知有时可能是意大利面条代码。就像所有的回调一样,有时候你会遇到类似goto的情况。但是,它不一定与特定对象(如KVO)的特定属性紧密耦合。它只是在等待一个可能包含很多不同内容的非常通用的通知。然而,就其性质而言,通知往往更特定于用例,并且易于应用于定制场景

KVO as-a-specific-technology基于KVC约定构建,没有它们就无法工作。
它使得一些非常基本的、通用的锅炉板代码和紧耦合更容易创建,

KVC是KVO的基础;从文档中可以看出:“为了被视为与特定属性的KVO兼容,类必须…与属性的键值编码兼容”。一个检测到更改,另一个允许它们传播。。。对titaniumde和Grady来说,这不是一个真正有用的回答:KVO使用变更字典和可选上下文来告诉观察者对象新的属性值是什么。因此,KVC似乎不需要它(至少根据苹果提供的绑定示例)。换句话说,根据引用的示例,控制器的属性仅在模型的“温度”属性或视图的温度滑块或温度文本字段的“温度”属性更改时更改。同样,由于视图和模型也是控制器温度属性的观察者,因此传播通过KVO进行。例如,用户更改温度滑块。控制器是滑块特性的观察者,因此会通知它并更改其温度特性。模型是控制器温度特性的观察者,因此它会得到通知,并改变其温度特性。因此,所需的传播已经发生,并且它也可以以相反的方向发生(模型到控制器到滑块和文本字段)。似乎不需要KVO。我遗漏了什么?你似乎在KVC和KVO之间随意交替提问和评论;“通过KVO进行传播”。。。“似乎不需要KVO”。。。当你似乎交替使用这两个首字母缩略词时,很难回答你的问题。