2013-12-19 7 views
0

Скажем, у меня есть 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 для автоматического добавления образ усы, когда он обнаруживает, что в его источник данных добавлен бакенбард. Я не хочу добавлять Whisker в экземпляр CatModel, а также добавлять метод AddWhisker в CatView. Каков наилучший способ сделать это?

+2

Похоже, вы желая CatView к CatModel наблюдателя: https://developer.apple.com/library/ios/documentation/cocoa/conceptual/KeyValueObserving/Articles/KVOCompliance.html Или, вы можете использовать протоколы/делегатов, и сообщите им, когда добавлен бакенбард. Или вы можете использовать NSNotifications, чтобы подписчики знали. – Josh

ответ

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, внутри метод -addWhisker:, вы должны уведомить наблюдателя о том, что бакенбард был добавлен:

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

Если вы хотите иметь несколько «наблюдателей», вы можете рассмотреть возможность использования НОД и блоков на основе «уведомления», например, так:

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

Но я не буду обсуждать этот метод в этом ответе. В качестве подсказки я могу предложить использовать NSMutableArray, сохраняя все эти блоки, а затем итератизируя эти блоки в методе -addWhisker: и вызывая каждый блок.