0

我有 setKeys: triggerChangeNotificationsForDependentKey: 方法的代码

[CKTransferRecord setKeys:[NSArray arrayWithObject:@"progress"] triggerChangeNotificationsForDependentKey:@"nameWithProgress"]; 
[CKTransferRecord setKeys:[NSArray arrayWithObjects:@"progress", @"name", @"size", nil] triggerChangeNotificationsForDependentKey:@"nameWithProgressAndFileSize"];

但我不知道这个是什么替代品。因为这个方法是不推荐使用的方法。什么是替换此代码?请帮我。

4

1 回答 1

1

请参阅Key-Value Observing Programming Guide中的注册依赖键

当某些键值对观察到您的类的属性时,框架将+keyPathsForValuesAffectingValueForKey:在您的类上调用以了解哪些其他键路径会影响该属性。因此,KVO 隐含地观察那些其他关键路径,并且当其中一个发生更改时,也会为最初观察到的属性生成更改通知。

实现这一点的一种方法是+keyPathsForValuesAffectingValueForKey:在您的类中覆盖。打电话super。之后,比较key参数以查看它是否与您的属性之一匹配。如果确实如此并且该属性依赖于其他关键路径,则将这些关键路径添加到从super的实现返回的集合中。

但是,有一个更简单的捷径。如果您的类实现了默认实现,+keyPathsForValuesAffectingValueForKey:将调用它。+keyPathsForValuesAffecting<Key>所以,你可以实现

+ (NSSet*) keyPathsForValuesAffectingNameWithProgress
{
    return [NSSet setWithObject:@"progress"];
}

+ (NSSet*) keyPathsForValuesAffectingNameWithProgressAndFileSize
{
    return [NSSet setWithObjects:@"progress", @"name", @"size", nil];
}

我发现在引用其他关键路径的属性的 getter 实现旁边实现这些方法是最有用的。这样就可以一起查看和更新​​它们。

于 2013-06-18T09:57:19.670 回答