ios – 是否可以在目标C中为静态变量设置KVO通知?

ios – 是否可以在目标C中为静态变量设置KVO通知?,第1张

概述我有类A,实例变量从缓存数据派生属性,这个缓存数据表示为单例并且是A的一部分(它本质上是一个NSDictionary).此缓存有时会被修改. 当发生这种情况时,我希望所有A实例在下次访问其属性时从缓存中提取新信息,或者换句话说,使其属性内容无效. 到目前为止,每个实例都是手动通知的(使用静态数组来跟踪成员).我不是粉丝.通知中心可能有一个选项,但我宁愿尝试使用KVO. 有没有人设法从iOS上的类变 我有类A,实例变量从缓存数据派生属性,这个缓存数据表示为单例并且是A的一部分(它本质上是一个NSDictionary).此缓存有时会被修改.

当发生这种情况时,我希望所有A实例在下次访问其属性时从缓存中提取新信息,或者换句话说,使其属性内容无效.

到目前为止,每个实例都是手动通知的(使用静态数组来跟踪成员).我不是粉丝.通知中心可能有一个选项,但我宁愿尝试使用KVO.

有没有人设法从iOS上的类变量订阅KVO更改? (换句话说,使用A的静态变量的变化来告诉A实例刷新它们的数据.)

换句话说,我很乐意拥有

static voID* context = &context;static myHadHocObject* msignal;

后来在A类代码中

[msignal addobserver:self forKeyPath:@"operation" options:NSkeyvalueObservingOptionNew context:context];

并通过以下方式通知类实例中的msignal更改

-(voID)observeValueForKeyPath:(Nsstring *)keyPath ofObject:(ID)object change:(NSDictionary *)change context:(voID *)context{}

我试过使用各种特殊课程,没有运气.好像我错过了什么.

欢迎指点,谢谢!

解决方法 KVO说特定对象观察到另一个对象(或其自身)的属性的变化.所以我认为你想要达到的目标是不可能的,至少不是这样的.或者至少你需要深入研究KVO机制.

您可以从Apple Key-Value Observing Programming Guide获得回答问题所需的所有信息

Unlike notifications that use NSNotificationCenter,there is no
central object that provIDes change notification for all observers.
Instead,notifications are sent directly to the observing objects when
changes are made. NSObject provIDes this base implementation of
key-value observing,and you should rarely need to overrIDe these
methods.

你可以使用-willChangeValueForKey:和 – dIDChangeValueForKey:来激活KVO.您可以在NSKeyValueObserving Protocol Reference了解更多相关信息

我建议您使用不同的方法,通过创建管理器来管理缓存并观察缓存上的值,这只是一个例子.

CacheManager.h

#import <Foundation/Foundation.h>@interface CacheManager : NSObject@property (nonatomic,strong,Readonly) NSArray *data;+ (instancetype)sharedManager;@end

CacheManager.m

#import "CacheManager.h"@implementation CacheManager- (instancetype)init {    if (self = [super init]) {        _data = [[NSArray alloc] init];    }    return self;}+ (instancetype)sharedManager {    static CacheManager *selfManager;    static dispatch_once_t oncetoken;    dispatch_once(&oncetoken,^{        selfManager = [[[self class] alloc] init];    });    return selfManager;}@end

VIEwController.m

#import "VIEwController.h"#import "CacheManager.h"static voID *CacheManagerDataChangedContext = &CacheManagerDataChangedContext;@implementation VIEwController- (voID)vIEwDIDLoad {    [super vIEwDIDLoad];    CacheManager *cacheManager = [CacheManager sharedManager];    [cacheManager addobserver:self forKeyPath:NsstringFromSelector(@selector(data)) options:NSkeyvalueObservingOptionNew context:CacheManagerDataChangedContext];}- (voID)dealloc {    [[CacheManager sharedManager] removeObserver:self forKeyPath:NsstringFromSelector(@selector(data)) context:CacheManagerDataChangedContext];}- (voID)observeValueForKeyPath:(Nsstring *)keyPath ofObject:(ID)object change:(NSDictionary *)change context:(voID *)context {    if (context == CacheManagerDataChangedContext) {        <# your stuff #>    }    else {        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];    }}@end

如果您从所有其他实例中观察CacheManager的data属性,那么当该更改时,将通知所有该实例.

希望有所帮助;)

总结

以上是内存溢出为你收集整理的ios – 是否可以在目标C中为静态变量设置KVO通知?全部内容,希望文章能够帮你解决ios – 是否可以在目标C中为静态变量设置KVO通知?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1045204.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存