我有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{
}
我试图使用各种had hoc类,但是没有运气。似乎我缺少了一些东西。
指针是受欢迎的,谢谢!
最佳答案
KVO说,一个特定的对象观察到另一个对象(或其本身)的属性的变化。因此,我认为您试图实现的目标是不可能的,至少不是这样。或者至少您需要更深入地了解KVO机制。
您可以从Apple Key-Value Observing Programming Guide获取所有需要回答问题的信息。
您可以使用- 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 - 是否可以在 objective-c 中为静态变量设置KVO通知?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30413110/