假设我有一个CatModel对象:
@interface CatModel : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) UIImage *catImage;
- (void)addWhisker:(Whisker*)whisker;
我有一个CatView:
@interface CatView : UIView
@property (nonatomic, strong) CatModel *dataSource;
@end
我希望CatView在检测到向其dataSource添加了一个whisker时自动添加一个whisker图像。我不想在CatModel实例中添加Whisker,还要向CatView添加addWhisker方法。最好的方法是什么?
答案 0 :(得分:0)
听起来您可以使用键值观察,但不幸的是,NSArray
或任何其他集合都不兼容KVO。
相反,您可能希望创建一个委托功能:
@protocol CatModelObserving
@optional
- (void)catModel:(CatModel *)model didAddWhisker:(Whisker *)whisker;
@end
...
@interface CatModel
@property (weak, nonatomic) id <CatModelObserving> observer;
@end
然后,您将确保CatView
符合该协议并实现该方法:
- (void)catModel:(CatModel *)model didAddWhisker:(Whisker *)whisker {
// handle it properly
}
在您CatModel.m
的{{1}}方法中,您应该通知观察者已经添加了胡须:
-addWhisker:
如果您希望拥有多个“观察者”,您可以考虑使用GCD和基于块的“通知”,如下所示:
if (self.observer && [self.observer respondsToSelector:@selector(catModel:didAddWhisker:)]) {
[self.observer catModel:self didAddWhisker:whisker];
}
但我不会在这个答案中讨论这种方法。作为提示,我可以建议使用[catModel addDidAddWhiskerBlock:^(Whisker *whisker) {
// handle it properly
}];
存储所有这些块,然后在NSMutableArray
方法中迭代这些块并调用每个块。