如何为只读派生的NSArray属性实现KVO? [英] How to implement KVO for readonly derived NSArray property?
问题描述
我想为声明为readonly
的NSArray
属性实现KVO.此readonly
属性的getter返回私有NSMutableArray
的副本,该副本支持公共readonly
的副本:
I'd like to implement KVO for an NSArray
property that is declared as readonly
. The getter for this readonly
property returns a copy of the private NSMutableArray
that backs the backs the public readonly
one:
在我的.h
中:
@interface MyClass : NSObject
@property (readonly, nonatomic) NSArray *myArray;
- (void)addObjectToMyArray:(NSObject *)obj;
- (void)removeObjectFromMyArray:(NSObject *)obj;
@end
在我的.m
中:
@interface MyClass()
@property (strong, nonatomic) NSMutableArray *myPrivateArray;
@end
@implementation MyClass
- (NSArray *)myArray {
return (NSArray *)[self.myPrivateArray copy];
}
- (void) addObjectToMyArray:(NSObject *)obj {
[self willChangeValueForKey:@"myArray"];
[self.myPrivateArray addObject:obj];
[self didChangeValueForKey:@"myArray"];
}
- (void) removeObjectToMyArray:(NSObject *)obj {
[self willChangeValueForKey:@"myArray"];
[self.myPrivateArray removeObject:obj];
[self didChangeValueForKey:@"myArray"];
}
@end
在测试中,我在调用didChangeValueForKey:
时看到抛出异常.这是正确的方法吗?
In my tests, I am seeing an exception thrown when I call didChangeValueForKey:
. Is this the correct way to do this?
推荐答案
我建议您不要对可变数组使用单独的属性.而是让array属性由可变数组变量支持.然后,实现索引集合变异访问器,并通过这些访问器对数组进行所有更改. KVO知道要挂接到那些访问器并发出更改通知.实际上,它可以发出更好,更具体的变更通知,从而使观察者可以更有效地做出响应.
I recommend that you don't use a separate property for the mutable array. Instead, have the array property backed by a mutable array variable. Then, implement the indexed collection mutating accessors and make all changes to the array through those. KVO knows to hook into those accessors and emit change notifications. In fact, it can emit better, more specific change notifications that can allow observers to be more efficient in how they respond.
@interface MyClass : NSObject
@property (readonly, copy, nonatomic) NSArray *myArray;
- (void)addObjectToMyArray:(NSObject *)obj;
- (void)removeObjectFromMyArray:(NSObject *)obj;
@end
@interface MyClass()
// Optional, if you want to be able to do self.myArray = <whatever> in your implementation
@property (readwrite, copy, nonatomic) NSArray *myArray;
@end
@implementation MyClass
{
NSMutableArray *_myArray;
}
@synthesize myArray = _myArray;
// If you optionally re-declared the property read-write internally, above
- (void) setMyArray:(NSArray*)array {
if (array != _myArray) {
_myArray = [array mutableCopy];
}
}
- (void) insertObject:(id)anObject inMyArrayAtIndex:(NSUInteger)index {
[_myArray insertObject:anObject atIndex:index];
}
- (void) removeObjectFromMyArrayAtIndex:(NSUInteger)index {
[_myArray removeObjectAtIndex:index];
}
- (void) addObjectToMyArray:(NSObject *)obj {
[self insertObject:obj inMyArrayAtIndex:_myArray.count];
}
- (void) removeObjectToMyArray:(NSObject *)obj {
NSUInteger index = [_myArray indexOfObject:obj];
if (index != NSNotFound)
[self removeObjectFromMyArrayAtIndex:index];
}
@end
这篇关于如何为只读派生的NSArray属性实现KVO?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!