测试已测试 | ✗ |
语言语言 | Obj-CObjective C |
许可证 | MIT |
发布日期最后发布日期 | 2015年3月 |
由Matthijn Dijkstra,Ian Bytchek维护。
我们都喜欢Objective-C的KVO系统。然而,它的使用却相当繁琐。[链接](http://nshipster.com/key-value-observing/)。设置起来很烦人,如果在一个不同对象上观察多个属性,那么将遍地都是代码重复。Observatory旨在解决这些烦恼。
假设你经营一家宠物店,我们想检查一些动物的食物供应,比如PETSquirrel
和PETRabbit
。使用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
对于观察者,以下方法可用
观察给定的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与我共同参与原始项目,在这个项目中这个想法首次见光。