我有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/

10-11 05:41