2014-09-12 5 views
2

나는 인터페이스에서 노출 한 배열을 변경할 수 있습니다. 또한 배열 접근자를 노출하여 배열을 수정했습니다. 배열 내에서 수정이 발생하면 KVO를 사용하여 일부 데이터를 재설정하고 다시 계산해야합니다.NSMutableArray에서 관찰 - 배열 접근 자만 사용할 수

배열 특성 + 배열 접근 + 래퍼 배열 접근을 위해 :

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; 

모든 미세의 KVOs는 배열 접근을 제공하는 트리거 또는 래퍼가 호출 아래 그림과 같이, 내가 array accessors을 사용하고 KVO를 지원하기 위해 다른 프로그래머들도.

문제 :

[portfolioObject.portfolioItemArray addObject:xxxxx]; 

대신에 : 일부 다른 개발자가 수행하도록 선택할 수 있습니다

[portofolioObject addObjectToPortfolioItemArray:xxxxx]; 

이 전체 설치를 나사 것하고는 KVO를 트리거하지 않습니다. 이것을 처리하는 더 좋은 메커니즘이 있습니까? 배열 접근자를 사용하지 않고 프로그래머가 변경 가능한 배열에 직접 삽입하는 것을 피하는 방법은 무엇입니까?

편집 : 외장 (요구 사항의 일부)에서 설정할 수 있으므로 언급 해야겠다. 배열을 노출해야합니다. -portfolioItemArray에 대한 setter를 재정 의하여 내 KVO 관측을 업데이트합니다.

답변

2

가변 배열을 노출시키지 마십시오. 불변의 배열과 포트폴리오 변경을위한 몇 가지 메소드를 공개하십시오.

+0

외장 (요구 사항의 일부)에서 설정할 수 있으므로 배열을 노출해야합니다. -portfolioItemArray에 대한 setter를 재정 의하여 내 KVO 관측을 업데이트합니다. –

+0

어레이가 "외부에서 설정"된다는 것이 정확히 무엇입니까? 외부에서 배열을 변경하기 위해 돌연변이 방법을 이미 노출했습니다. 배열이 불변 인 경우에도 작동합니다. 변경 가능한 배열을 드러내는 것은 잘못된 캡슐화, 잘못된 디자인입니다. 주위를 일하는 것은 고통 스러울 것입니다. – zoul

+0

외부에서 배열을 설정하면 다음과 같은 방식으로 API를 사용하게됩니다. [aPortfolio setPortfolioItemArray : newPortfolioArray] –