当前位置:  开发笔记 > 后端 > 正文

在objective-c(iphone版)中观察者/观察者最好的方法是什么?

如何解决《在objective-c(iphone版)中观察者/观察者最好的方法是什么?》经验,为你挑选了2个好方法。

我习惯于编写Java Swing UI,如果你有一些属性发生变化,并且你希望你的UI更新,你将实现观察者/可观察模式.在Java中,您通常通过让您的类维护一个监听器列表来通知不同的事件.

我在Mac上玩过Objective-C,它有KVC和绑定,看起来非常好用,并且需要的代码更少.虽然iPhone SDK似乎没有这个功能,所以我的问题是:如果我有一个包含更改数据的类,那么我最好的方法是向该类注册一个UI组件,以便通知它需要显示的数据变化?



1> Chris Hanson..:

在Cocoa中有两种内置的观察方式:键值观察和通知.在这两个系统中,您都需要自己维护或通知一组观察者; 框架将为您处理.

键值观察(KVO)允许您观察对象的属性 - 甚至包括表示集合的属性 - 并通知该属性的更改.您只需要发送-addObserver:forKeyPath:options:context:传递要接收更新的对象的对象,要为其接收更新的属性(相对于接收方)的关键路径,以及要接收的更新类型.(如果要观察表示集合的属性,可以使用类似的方法.)

通知较旧且较重.您注册了NSNotificationCenter- 通常是默认中心 - 在事件发生时传递通知的对象和选择器对.通知对象本身可以通过其userInfo属性包含任意数据,您可以选择观察特定名称的所有通知,而不是适用于特定对象的通知.

在任何特定情况下你应该使用哪个?通常,如果您关心对特定对象的特定属性的更改,请使用键值观察.这就是它的设计目标,它有意轻巧.(在其他用途​​中,它是构建Cocoa Bindings的基础.)如果您关心的是状态的更改,而不是由属性表示,则通知更合适.

例如,要在用户更改模型对象的名称时保持同步,我将使用KVO.要知道保存整个对象图的时间,我会使用通知.


很好的答案 - 但是使用KVO方法,如何删除已注册许多对象的观察者?我(错误地)认为KVO在引擎盖下使用了通知 - 但我不认为这样做.因此在使用addObserver:X forKeyPath:...后,如果你以后再尝试:[[NSNotificationCenter defaultCenter] removeObserver:X]这不起作用?这似乎暗示您必须保留X正在观察的所有对象的单独列表,以便您可以删除观察.或者我错过了什么?

2> rustyshelf..:

我还发现你可以这样做:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_handleWhateverChange) name:@"whateverChange" object:nil];

注册变更事件,和

[[NSNotificationCenter defaultCenter] postNotificationName:@"whateverChange" object:nil];

解雇他们.我可能是一个N00b,但我无法让关键路径的观察者为我工作.

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有