键值观察:我可以观察所有属性的变化吗?

时间:2013-05-14 15:27:30

标签: ios key-value-observing

每当我的对象上的属性被更改或更新时,我想更改变量(nonce变量)。这个随机数是基于时间的。因此,每次更新属性时,此随机数都会更新为当前时间。

有没有办法自动监听我对象上的所有关键更改?或者我是否必须单独手动维护每个属性的所有keyvalue观察者?

非常感谢

2 个答案:

答案 0 :(得分:6)

您是否看过Obj-C运行时函数?请参阅文档中的here。例如,这会为您提供类Lender中所有属性的列表。 (顺便说一句:我不在我的Mac上,所以这只是文档中的内容):

@interface Lender : NSObject {
    float alone;
}
@property float alone;
@end

您可以使用以下方式获取属性列表:

id LenderClass = objc_getClass("Lender");
unsigned int outCount;
objc_property_t *properties = class_copyPropertyList(LenderClass, &outCount);

然后您可以获取属性的名称:

const char *property_getName(objc_property_t property)

如果你把这些名字传回addObserver:forKeyPath:options:context,你应该是金色的。

答案 1 :(得分:1)

一些想法:

1)您可以向运行时询问属性和ivars及其类型,并使用该信息创建和删除观察者。如果你是为一个对象做这件事,显然需要做很多工作。

2)如果你的属性是“常规”,意味着所有强大的对象,那么你可以使用@dynamic(防止setter / getter创建),然后使用resolveInstanceMethod:或来自NSObject的其他时髦方法来捕获{{ 1}}和setMyObject:来电。您实质上可以执行系统为“set ...”调用所做的操作,并动态获取变量的字符串。然后你可以更新/获得一个ivar,也许是一个前缀为“ - ”的东西,你可以做你的观察者会做的事情。

3)您可以将所有ivars放入“Helper”类中,并使用myObject将所有设置者指向它(当然可以向您发送消息)。我在one of my github projects

中使用了这种技术(有点)