在Objective-C中,隐藏可变数据支持的不可变属性并支持符合KVO的集合的最佳模式是什么?

在Objective-C中,隐藏可变数据支持的不可变属性并支持符合KVO的集合的最佳模式是什么?,objective-c,properties,key-value-observing,Objective C,Properties,Key Value Observing,我有一个类,它的属性是由可变数组支持的数组。如果我希望此属性与KVO兼容,那么最好的模式是什么 以下代码KVO是否与属性数据兼容 @interface Store : NSObject @property (readonly) NSArray *data; @end @interface Store () @property (strong) NSMutableArray *storeData; @end @implementation Store - (NSArray *)data {

我有一个类,它的属性是由可变数组支持的数组。如果我希望此属性与KVO兼容,那么最好的模式是什么

以下代码KVO是否与属性数据兼容

@interface Store : NSObject
@property (readonly) NSArray *data;
@end

@interface Store ()
@property (strong) NSMutableArray *storeData;
@end

@implementation Store
- (NSArray *)data {
  return [NSArray arrayWithArray:self.storeData];
}

@end
如何使数据属性与集合KVO兼容?现在我(在Aaron Brager的帮助下)可以想出两个选择

首先是做手工张贴。 第二种是使用可变集合KVC方法(例如,
mutableArrayValueForKey:

还是有其他方法可以做到这一点

第二种选择需要更少的代码,但不能阻止其他对象改变数据属性

你喜欢哪种方式

以下代码KVO是否与属性数据兼容

@interface Store : NSObject
@property (readonly) NSArray *data;
@end

@interface Store ()
@property (strong) NSMutableArray *storeData;
@end

@implementation Store
- (NSArray *)data {
  return [NSArray arrayWithArray:self.storeData];
}

@end
否。如果修改了
storeData
,则不会为密钥路径“data”生成通知

如中所述,这是一种“对一”关系

因此,您应该添加:

+ (NSSet *)keyPathsForValuesAffectingData {
    return [NSSet setWithObjects:@"storeData", nil];
}

另外,请注意,只有更改
storeData
才会发出通知。在可变数组中添加或删除对象不会导致通知。如果要执行此操作,请在向
storeData
添加或删除对象时手动发布更改通知,或者在完成更改时使用
self.storeData=[self.storeData mutableCopy]

如果实现
keypathsforvaluesafectingvalueforkey:
,您需要手动执行哪些操作?您正在谈论的是所谓的“依赖密钥”,您可以采取的不同方法基本上都概述在这里:我的意思是我必须执行手动KVO通知,或者使用
keypathsforvaluesafectingvalueforkey
或其他方式?是的,选择“依赖密钥”是一种方法,但我想知道是否有更好的方法。我不确定依赖键是否支持收集KVO,例如
更改:valuesIndexes:forKey:
keypathsforvaluesFectingData
方法是否也发布收集KVO通知?如果没有,有没有办法支持这一点?我明白了。所以我有两个选择,第一个是手动发布,第二个是使用可变集合KVC方法(例如,
mutableArrayValueForKey:
,它需要更少的代码,但其他对象也可以改变数据属性,您更喜欢哪种方法?或者有其他方法吗?