Ios 如何使视图对象对其数据源的更改作出响应

Ios 如何使视图对象对其数据源的更改作出响应,ios,objective-c,model-view-controller,model-view,Ios,Objective C,Model View Controller,Model View,假设我有一个CatModel对象: @interface CatModel : NSObject @property (nonatomic, copy) NSString *name; @property (nonatomic, strong) UIImage *catImage; - (void)addWhisker:(Whisker*)whisker; 我有一个CatView: @interface CatView : UIView @property (nonatomic, str

假设我有一个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在检测到胡须已添加到其数据源时自动添加胡须图像。我不想向CatModel实例添加Whisker,也不想向CatView添加addWhisker方法。最好的方法是什么?

听起来您可能会使用键值观察,但不幸的是,NSArray或任何其他集合都不兼容KVO

相反,您可能希望创建一个委托功能:

@protocol CatModelObserving

@optional

- (void)catModel:(CatModel *)model didAddWhisker:(Whisker *)whisker;

@end

...  

@interface CatModel


@property (weak, nonatomic) id <CatModelObserving> observer;

@end
在CatModel.m中,在-addWhisker:方法中,您应该通知观察者已添加了一个晶须:

if (self.observer && [self.observer respondsToSelector:@selector(catModel:didAddWhisker:)]) {
    [self.observer catModel:self didAddWhisker:whisker];
}

如果您希望有多个观察者,您可以考虑使用GCD和基于块的通知,例如:

[catModel addDidAddWhiskerBlock:^(Whisker *whisker) {
    // handle it properly
}];

但我不会在这个答案中讨论这个方法。作为提示,我可以建议使用NSMutableArray存储所有这些块,然后在-addWhisker:方法中迭代这些块并调用每个块。

听起来像是希望CatView观察CatModel:或者,您可以使用协议/委托,并在添加胡须时通知他们。或者,您可以使用NSNotifications通知订阅者。
[catModel addDidAddWhiskerBlock:^(Whisker *whisker) {
    // handle it properly
}];