Observatory 0.1.2

Observatory 0.1.2

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布日期最后发布日期2015年3月

Matthijn DijkstraIan Bytchek维护。



Observatory做什么?

我们都喜欢Objective-C的KVO系统。然而,它的使用却相当繁琐。[链接](http://nshipster.com/key-value-observing/)。设置起来很烦人,如果在一个不同对象上观察多个属性,那么将遍地都是代码重复。Observatory旨在解决这些烦恼。

示例

假设你经营一家宠物店,我们想检查一些动物的食物供应,比如PETSquirrelPETRabbit。使用Observatory,我们可以用几行代码就完成


@interface PETStore : NSViewController

// Some models (they should extend OBYModel)
@property (nonatomic, strong) PETRabbit* rabbit;
@property (nonatomic, strong) PETSquirrel* squirrel;

@end

@implementation PETStore

- (void)viewDidLoad
{
    // Observe all properties on the rabbit model
    [self observeModel:self.rabbit];

    // Observe only the nuts property on the squirrel model
    [self observeModel:self.squirrel onKeys[@"nuts"]];
}

// Called when the <carrots> property is changed on the <PETRabbit> instance
- (void)rabbit:(PETRabbit *)rabbit valueChangedForCarrots:(NSNumber *)carrots
{
    NSLog(@"Nom, I now have %d carrots!", [carrots intValue]);
}

// Called when the <nuts> property is changed on the <PETSquirrel> instance
- (void)squirrel:(PETSquirrel *)squirrel valueChangedForNuts:(NSNumber *)nuts
{
    NSLog(@"Nom, I now have %d nuts!", [nuts intValue]);
}

@end

所以,这里发生了什么?Observatory确定你正在观察的类的名称和属性,并基于此生成一个独特的选择器。

所以,如果我们有一个具有属性carrots的模型PETRabbit,当属性carrots变化时,将在观察者上调用以下选择器

- (void)rabbit:(PETRabbit *)valueChangedForCarrots:(id)carrots;

这里的模式是

- (void)[className]:(Class *)valueChangeFor[value]:(id)value;

很容易,对吧?

安装

然后运行pod install

API

NSObject+OBYObserver

对于观察者,以下方法可用

观察给定的OBYModel上所有键

- (void)observeModel:(OBYModel*)model;

一次性添加多个OBYModel的观察

- (void)observeModels:(NSArray*)models;

停止所有OBYModel的观察

- (void)removeAsObserverForAllModels;

为给定的OBYModel移除观察

- (void)removeAsObserverForModel:(OBYModel *)model;

用法

如安装部分所述,首先安装Observatory。然后添加

#import <Observatory/NSObject+Observer>

到作为观察者的对象。这将使上述API可用。

您想要观察的对象应该扩展OBYModel.

最后要注意:您的类应该具有三个字母的前缀,以确定正确的类名。

更多信息

如果您的观察者中没有实现特定的选择器,观测台将“回退”到更通用的选择器。例如,如果您没有实现早期的rabbit: valueChangedForCarrots选择器,它将尝试以下更通用的选择器。

- (void)rabbit:(PETRabbit *) valueChangedForKey(NSString *)key;

结构如下

- (void)[model]:(Class *) valueChangedForKey(NSString *)key;

如果此选择器也没有实现,它将回退到最通用的选择器。

- (void)model:(OBYModel*)model valueChangedForKey:(NSString*)key;

感谢

感谢Nils Wiersema与我共同参与原始项目,在这个项目中这个想法首次见光。