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

Ios removeAllObjects上的KVO分别触发每个项的NSKeyValueChangeRemove,ios,key-value-observing,kvc,Ios,Key Value Observing,Kvc,我正在用KVO观看NSArray属性。我在中实现了KVC,并且还实现了大多数KVC阵列访问器。要对其进行变异,我使用mutableArrayValueForKey。它工作正常,但有两个问题除外: 当我调用removeAllObjects时,我会得到一个nskeyvaluechangeremovementchange用于每个被删除的项目。我只希望收到一个nsKeyValueChangeRemoving通知,其中包含所有已删除的索引 类似地,当我调用addObjectsFromArray:时,我会为

我正在用
KVO
观看
NSArray
属性
。我在中实现了
KVC
,并且还实现了大多数
KVC
阵列访问器。要对其进行变异,我使用
mutableArrayValueForKey
。它工作正常,但有两个问题除外:

  • 当我调用
    removeAllObjects
    时,我会得到一个
    nskeyvaluechangeremovement
    change用于每个被删除的项目。我只希望收到一个
    nsKeyValueChangeRemoving
    通知,其中包含所有已删除的索引

  • 类似地,当我调用
    addObjectsFromArray:
    时,我会为每个添加的项获取
    NSKeyValueChangeInsertion
    。我只希望收到一个
    nskeyvaluechangeinertion
    通知,其中包含所有添加的索引


  • 注意,我确实实现了KVC方法
    removitemsatindexes:
    insertItems: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];
    }
    

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

    我相信您知道,人们无法观察数组本身,只能观察数组的属性。所以我认为你的解决办法是不可避免的


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

    最后一行代码有错吗?是的,谢谢。更正。你能详细解释一下为什么你认为这是不可避免的吗?我猜问题源于方法
    removeAllObjects
    addObjectsFromArray:
    的实现,它们逐个添加/删除项。当然我问了这个问题,也许我忽略了什么。当变通方法不可避免时,我会将变通方法分类为
    NSArray
    上的方法。正如我所说,数组的对象是观察到的,而不是数组本身。这就解释了不可避免的问题。分类似乎是一个好办法。