【问题标题】:Using KVO to observe changes to a property on an object inside a collection in Objective-C使用 KVO 观察 Objective-C 集合内对象属性的变化
【发布时间】:2011-08-07 04:34:35
【问题描述】:

我有一个核心数据对象 (AGroup),它与其他核心数据对象(项目,它们是 ANItem 的实例)的集合具有一对多关系。我在 UITableView 中使用 AGroup 对象(这是在 iOS 上),并且项目的显示顺序由项目的属性(sortProperty)确定。所以,代码方面(忽略它们是核心数据对象,所以这是半伪代码)它看起来像这样:

@interface AGroup : NSManagedObject
{
    NSSet *items; // these are instances of ANItem
}
@property (retain) NSSet *items;
@end

@interface ANItem : NSManagedObject
{
    NSNumber *sortProperty;
}
@property (retain) NSNumber *sortProperty;
@end

好的,那么,这里的重点是 UITableView 有一个 AGroup 对象的实例,并且正在显示项目列表,并且项目的显示顺序由 sortProperty 属性决定。

所以,我想知道 ANItem 实例上的 sortProperty 何时更改,以便我可以更新表视图。我想知道,有没有办法可以使用 KVO 从 AGroup 对象中观察 sortProperty?比如:

[group addObserver:self forKeyPath:@"items.sortProperty" options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld) context:nil];

甚至:

[group addObserver:self forKeyPath:@"items.@sum.sortProperty" options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld) context:nil];

会起作用,因为总和会随着值的变化而变化。

不过,我已经尝试过了,但我得到了一个无效参数错误。

有人知道这是否可能吗?如果有,怎么做?

我意识到我可以执行 fetch 请求并按 sortProperty 对请求进行排序,但由于其他一些应用程序架构限制,在这种情况下这实际上是不可能的。所以本质上,这有点归结为想象我只是在一种对象关系中处理一个普通的旧 NSSet。我只提到核心数据方面,以防由于其他限制/等而影响答案?

【问题讨论】:

    标签: objective-c ios core-data ios4


    【解决方案1】:

    我很确定没有办法直接观察这样的集合的内容。我认为最好的办法是定义符合 KVC/KVO 的 set accessors/mutators,观察 self.items,并使用更改通知在每个对象添加到集合时直接观察它们的 sortProperty。

    由于这是核心数据,您可能还需要/替代地使用上下文保存通知来检测项目的变化。不过,我没有足够的 Core Data 经验可以肯定地说。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-02
      • 2014-12-20
      相关资源
      最近更新 更多