我将NSMutableArray子类化,以允许使用数据源。这称为BaseObjectArray。该数组实际上仅包含一个rowid列表(如uint64_t),并且在请求objectAtIndex时,它会向数据源代理请求具有该rowid的对象(以允许进行惰性DB查询)。

内部的rowid列表本身就是一个类(RowIDSet或OrderedRowIDSet子类,它只是NSObject的子类),它仅维护唯一的rowid的列表。

我需要以某种方式侦听对BaseObjectArray的更改(实际上是通过类似的方法来侦听其RowIDSet对象的更改)。

由于可以不使用标准的addObject :,而是使用addRowID:从BaseObjectArray中添加/删除对象,因此拥有BaseObjectArray的对象可能不会获得标准的KVO通知。

我考虑过的可能解决方案:


BaseObjectArray具有owner和ownerKey属性,并且BaseObjectArray触发器[owner willChangeForKey:ownerKey];每当有任何变化。
使用will / didChangeNotificationBlocks-侦听器可以简单地将一个块添加到BaseObjectArray(将这些块保留在NSMutableArray中),并且当BaseObjectArray中的某些内容发生更改时,将触发该数组中的所有块。我不确定可能会发生的保留周期噩梦。
KVO位于BaseObjectArray的“内容”属性上。任何想观察BaseObjectArray的人实际上都会观察keyPath的“内容”,并且在BOArray内部会调用[self willChangeForKeyPath:@“ contents”]。 contents属性只是返回self。
...我显然想念的东西...


请让我知道其中是否最有意义的方法,或者是否有更好的解决方案。

谢谢 :)

最佳答案

除非您知道自己在做什么,否则不应将NSMutableArray子类化。 NSMutableArray是一个类集群,需要special treatment

为什么不创建一个使用普通NSMutableArray作为其存储类的自定义对象呢?在您的情况下,似乎没有充分的理由将NSMutableArray子类化,但是也许我误解了您的问题。

10-08 20:05