removeAllObjects上的KVO分别触发每个项目的NSKeyValueChangeRemove



我正在观看NSArray propertyKVO。我已经实现了类似于本文中的KVC,并且我还实现了大多数KVC数组访问器。为了使其发生变异,我使用mutableArrayValueForKey。它运行良好,除了2个问题:

  1. 当我调用removeAllObjects时,我会为每个删除的项目得到一个NSKeyValueChangeRemoval更改。我只想收到一个NSKeyValueChangeRemoval通知,其中包含所有已删除的索引。

  2. 类似地,当我调用addObjectsFromArray:时,我为每个添加的项目获得NSKeyValueChangeInsertion。我只想收到一个NSKeyValueChangeInsertion通知,其中包含所有添加的索引。


请注意,Ido已经实现了KVC方法remove<Key>ItemsAtIndexes:insert<Key>Items:atIndexes:。不过,它们不是调用的。

我使用以下解决方法:

- (void)removeAllObjectsWorkaroundFromArray:(NSMutableArray *)modelArray {
    NSRange indexRange;
    indexRange.length = modelArray.count;
    indexRange.location = 0;
    NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:indexRange];
    [modelArray removeObjectsAtIndexes:indexSet];
}
- (void)addObjectsFromArrayWorkaroundWithArray:(NSMutableArray *)modelArray arrayToAdd:(NSArray *)arrayToAdd {
    NSRange indexRange;
    indexRange.length = arrayToAdd.count;
    indexRange.location = modelArray.count;
    NSIndexSet *indexSet = [[NSIndexSet alloc] initWithIndexesInRange:indexRange];
    [modelArray insertObjects:arrayToAdd atIndexes:indexSet];
}

有没有一种方法可以直接使用removeAllObjectsaddObjectsFromArray:而不需要上述解决方案

我相信你已经知道,不能观察数组本身,只能观察它的属性。所以我认为你的解决方法是不可避免的。

话虽如此,我真的很喜欢你解决这个问题的方式!

最新更新