2014-09-12 2 views
2

У меня есть изменяемый массив, который я обнаружил в интерфейсе. Я также выставил аксессуры массива для изменения массива. Если в массиве произойдут какие-либо изменения, мне придется перезагрузить и перерасчитать некоторые данные с помощью KVO. Для поддержки КВО, я использую array accessors, как показано ниже:Наблюдение за NSMutableArray - только для аксессуаров Array, которые будут использоваться

массив свойства + массив аксессоров + обертку для аксессоров массива:

Mutable Array: 
@property (nonatomic, strong) NSMutableArray *portfolioItemArray; 

Array Accessors: 
-(void)insertObject:(Service*)object inPortfolioItemArrayAtIndex:(NSUInteger)index; 
-(void)removeObjectFromPortfolioItemArrayAtIndex:(NSUInteger)index; 
-(void)insertPortfolioItemArray:(NSArray *)array atIndexes:(NSIndexSet *)indexes; 
-(void)removePortfolioItemArrayAtIndexes:(NSIndexSet *)indexes; 

Wrappers for Array Accessors: 
-(void)addObjectToPortfolioItemArray:(Service*)inObject; 
-(void)removeObjectFromPortfolioItemArray:(Service*)inObject; 
-(void)addObjectsToPortfolioItemArray:(NSArray*)inPortfolioItemsArray; 
-(void)removeObjectsFromPortfolioItemArray:(NSArray*)inPortfolioItemsArray; 

Все хорошо, KV срабатывают при условии только аксессоров массива или его оболочки называются другими программистами тоже.

Проблема: Некоторые другие разработчики могут выбрать для выполнения:

[portfolioObject.portfolioItemArray addObject:xxxxx]; 

Вместо:

[portofolioObject addObjectToPortfolioItemArray:xxxxx]; 

это будет ввернуть всю установку и это не приводит к срабатыванию КВО. Есть ли лучший механизм для этого? Как избежать того, чтобы программисты не выбирали прямую вставку в изменяемый массив без использования аксессуаров массива?

Редактировать: Забыл упомянуть, мне пришлось бы выставить массив, потому что он может быть установлен снаружи (часть требования). Я обновляю свое наблюдение KVO, переопределяя сеттер для -portfolioItemArray.

ответ

2

Не подвергайте изменяемый массив. Выведите неизменяемый массив и несколько методов для изменения портфолио.

+0

Забыл упомянуть, мне пришлось бы выставить массив, потому что он может быть установлен снаружи (часть требования). Я обновляю свое наблюдение KVO, переопределяя сеттер для -portfolioItemArray. –

+0

Что именно означает, что массив «устанавливается снаружи»? Вы уже выставляете мутирующие методы для изменения массива извне. Это могло бы работать, даже если массив был неизменным. Выявление измененного массива - это просто плохая инкапсуляция, плохой дизайн. Работа вокруг него гарантированно будет болезненной. – zoul

+0

Установив массив извне, я имею в виду использование API следующим образом: [aPortfolio setPortfolioItemArray: newPortfolioArray] –