【问题标题】:Key-value observation: Can I observe for changes on ALL properties?键值观察:我可以观察所有属性的变化吗?
【发布时间】:2013-05-14 15:27:29
【问题描述】:

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

有没有办法自动监听我的对象的所有关键变化?还是我必须分别手动维护每个属性的所有键值观察器?

非常感谢

【问题讨论】:

标签: ios key-value-observing


【解决方案1】:

您看过 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,您应该是金子。

【讨论】:

  • 这太棒了,谢谢。 :) 有点迂回的方式,但非常有用。 :)
【解决方案2】:

一些想法:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2017-09-07
    • 1970-01-01
    • 2011-05-27
    • 2020-11-20
    • 2011-06-17
    • 2011-04-07
    • 2016-02-07
    • 1970-01-01
    • 2014-04-18
    相关资源
    最近更新 更多