KVOMutableArray
是一个代理对象,它支持对 NSMutableArray 的键值观察。
KVOMutableArray 通过 CocoaPods 提供。要安装它,只需将以下行添加到 Podfile 中
pod "KVOMutableArray"
KVOMutableArray 支持使用 ReactiveCocoa 信号进行监控。要启用此功能,请添加以下行代替
pod "KVOMutableArray/ReactiveCocoaSupport"
如果您还没有安装或整合 CocoaPods 到项目中,您可以在 这里 学习如何做到这一点。
要运行示例项目,请克隆仓库,然后首先从 Example 目录运行 pod install
。
KVOMutableArray* array = [KVOMutableArray new];
AMBlockToken* token = [array addObserverWithTask:^BOOL(id obj, NSDictionary *change) {
NSIndexSet *indexes = change[NSKeyValueChangeIndexesKey];
NSNumber *kind = change[NSKeyValueChangeKindKey];
NSArray* new = change[NSKeyValueChangeNewKey];
NSArray* old = change[NSKeyValueChangeOldKey];
if ([kind integerValue] == NSKeyValueChangeInsertion)
{
NSLog(@"objects %@ added at indexes: %@", new, indexes);
} else if ([kind integerValue] == NSKeyValueChangeRemoval)
{
NSLog(@"objects %@ removed from indexes: %@", old, indexes);
}
return YES;
}];
KVOMutableArray* array = [KVOMutableArray new];
[array addObject:@"hello"];
[array addObject:@"world"];
或者,您也可以这样做:
KVOMutableArray* array = [[KVOMutableArray alloc] initWithObjects:@(1), @(2), @(3), nil];
NSArray* someArray = @[@(1), @(2), @(3), @(4)];
KVOMutableArray* array = [[KVOMutableArray alloc] initWithArray:someArray];
AMBlockToken* token = [array addObserverWithTask:^BOOL(id obj, NSDictionary *change) {
// handle the event here
}];
或者,您可以使用 ReactiveCocoa 信号。
RACSignal* signal = [array changeSignal];
[signal subscribeNext:^(RACTuple* t) {
NSArray *obj = t.first;
NSDictionary *change= t.second;
// handle the event here
}];
[token removeObserver];
NSMutableArray* theMutableArray = array.arr;
从 KVOMutableArray 中操纵对象
KVOMutableArray* array = [[KVOMutableArray alloc] initWithArray:@[@"hello", @"world"]];
[array removeLastObject];
[array addObject:@"awesome!"];
[array removeObjectAtIndex:0];
NSString* awesome = array[0];
或者从封装的 NSMutableArray
KVOMutableArray* array = [[KVOMutableArray alloc] initWithArray:@[@"hello", @"world"]];
[array.arr removeLastObject];
[array.arr addObject:@"awesome!"];
[array.arr removeObjectAtIndex:0];
NSString* awesome = array.arr[0];
由于 1.0 版本的发布,现在 KVOMutableArray 成为 NSMutableArray 的子类。此更改产生了两个注意点:
首先,未存档的对象是一个NSMutableArray,而不是KVOMutableArray。 截至目前在StackOverflow上没有解决方案。
KVOMutableArray* array = [[KVOMutableArray alloc] initWithArray:@[@(1), @(2), @(3)]];
NSData* data = [NSKeyedArchiver archivedDataWithRootObject:array];
// not a KVOMutableArray
NSMutableArray* unarchived = [NSKeyedUnarchiver unarchiveObjectWithData:data];
其次,从copy
返回的对象是一个NSArray。没有不可变的KVOMutableArray,合理的选择是返回不可变的NSArray对象。
KVOMutableArray* array = [[KVOMutableArray alloc] init];
// not a KVOMutableArray
NSArray* copy = [array copy];
需要iOS 8.0及以上版本,以及ARC。
由于NSMutableArray不能直接进行键值观察,我们通过KVOMutableArray的一个属性侦测变更事件。更多详情请查看StackOverflow的讨论。
欢迎Fork、patches和其它反馈。
KVOMutableArray在MIT许可下可用。查看LICENSE文件以获取更多信息。