【发布时间】:2014-09-12 07:22:15
【问题描述】:
我有一个可变数组,已在界面中公开。我还公开了数组访问器来修改数组。如果数组中发生任何修改,我将不得不使用 KVO 重置并重新计算一些数据。为了支持KVO,我使用array accessors如下图:
数组属性 + 数组访问器 + 数组访问器的包装器:
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;
没关系,只要数组访问器或其包装器也被其他程序员调用,就会触发 KVO。
问题: 其他一些开发者可能会选择执行:
[portfolioObject.portfolioItemArray addObject:xxxxx];
代替:
[portofolioObject addObjectToPortfolioItemArray:xxxxx];
这会搞砸整个设置,并且不会触发 KVO。有没有更好的机制来处理这个问题?如何避免程序员选择直接插入可变数组而不使用数组访问器?
编辑:忘了说,我必须公开数组,因为它可以从外部设置(要求的一部分)。我正在通过覆盖 -portfolioItemArray 的设置器来更新我的 KVO 观察结果。
【问题讨论】:
标签: cocoa cocoa-touch nsmutablearray key-value-observing kvc