У меня есть изменяемый массив, который я обнаружил в интерфейсе. Я также выставил аксессуры массива для изменения массива. Если в массиве произойдут какие-либо изменения, мне придется перезагрузить и перерасчитать некоторые данные с помощью 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.
Забыл упомянуть, мне пришлось бы выставить массив, потому что он может быть установлен снаружи (часть требования). Я обновляю свое наблюдение KVO, переопределяя сеттер для -portfolioItemArray. –
Что именно означает, что массив «устанавливается снаружи»? Вы уже выставляете мутирующие методы для изменения массива извне. Это могло бы работать, даже если массив был неизменным. Выявление измененного массива - это просто плохая инкапсуляция, плохой дизайн. Работа вокруг него гарантированно будет болезненной. – zoul
Установив массив извне, я имею в виду использование API следующим образом: [aPortfolio setPortfolioItemArray: newPortfolioArray] –