KVOMutableArray 2.2.0

KVOMutableArray 2.2.0

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布上次发布2017年6月

Hai Feng Kao 维护。



  • Hai Feng Kao

KVOMutableArray 是一个代理对象,它支持对 NSMutableArray 的键值观察。

安装

KVOMutableArray 通过 CocoaPods 提供。要安装它,只需将以下行添加到 Podfile 中

pod "KVOMutableArray"

KVOMutableArray 支持使用 ReactiveCocoa 信号进行监控。要启用此功能,请添加以下行代替

pod "KVOMutableArray/ReactiveCocoaSupport"

如果您还没有安装或整合 CocoaPods 到项目中,您可以在 这里 学习如何做到这一点。

示例

要运行示例项目,请克隆仓库,然后首先从 Example 目录运行 pod install

那我可以用它做什么呢?

接收 KVO 通知,YES!

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 中初始化

NSArray* someArray = @[@(1), @(2), @(3), @(4)];
KVOMutableArray* array = [[KVOMutableArray alloc] initWithArray:someArray];

注册 KVO 事件

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
        
}];

停止接收 KVO 事件

[token removeObserver];

检索封装的 NSMutableArray 对象

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文件以获取更多信息。