【问题标题】:Observing on NSMutableArray - Only Array accessors to be used观察 NSMutableArray - 仅使用数组访问器
【发布时间】: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


    【解决方案1】:

    不要暴露可变数组。公开一个不可变数组和一些方法来改变投资组合。

    【讨论】:

    • 忘了提一下,我必须公开数组,因为它可以从外部设置(部分要求)。我正在通过覆盖 -portfolioItemArray 的设置器来更新我的 KVO 观察结果。
    • 数组“从外部设置”到底是什么意思?您已经公开了变异方法来从外部更改数组。即使数组是不可变的,这也会起作用。暴露一个可变数组只是糟糕的封装,糟糕的设计。解决它肯定会很痛苦。
    • 通过从外部设置数组,我的意思是,API 的使用方式如下:[aPortfolio setPortfolioItemArray:newPortfolioArray]
    • 您可以使用不可变数组 (NSArray) 来做到这一点。
    猜你喜欢
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 2022-11-08
    • 2017-04-28
    • 1970-01-01
    相关资源
    最近更新 更多