ios - KVO 核心数据和原始访问器

标签 ios cocoa core-data key-value-observing primitive

我的 iPhone 应用程序核心数据属性的自定义访问器方法有问题。我想做的不仅仅是取出原始类型并返回它。我有一个可能的 activityTypes 的 NSSet,如果对象没有 primitiveType,那么我想查看该集合并返回与我的类中的另一个变量匹配的 activityType。

以下是我为此编写的代码。代码的问题是我对 [self willChangeValueForKey:@"type"] 的调用导致无限循环,程序不断吐出 NSLog“Setting type to ...”——可能是因为我是从访问器中调用 willChange 吗?

如果我取出 [self willChangeValueForKey:@"type"] 我没有得到循环,程序运行正常,下次我尝试访问对象上的类型时类型被正确召回。但是,当我告诉我的 ManagedObjectContext 是时候保存时,它告诉我任何对象都没有更改 - 所以因为我没有调用 willChangeValueForKey - 对原始类型的更改永远不会为对象保留。

- (ActivityType *)type {

[self willAccessValueForKey:@"type"];
ActivityType *myType = [self primitiveType];
[self didAccessValueForKey:@"type"];

if (myType != nil) {
    NSLog(@"Use primitive (%@)", [myType myDescription]);

} else {

    // 1) find type
    NSSet *types = self.myActivityTypes;

    NSSet *foundTypes = [types objectsPassingTest:^BOOL(id obj, BOOL *stop) {
        ActivityType *object = (ActivityType *) obj;

        return ([object.typeName isEqualToString:self.activityTypeName]);

    }];

    myType = [foundTypes allObjects][0];

    NSLog(@"Setting type to %@", [myType myDescription]);

    // in this case we should not alert anyone since we are inside the getter?
    [self willChangeValueForKey:@"type"];
    [self setPrimitiveType:myType];
    [self didChangeValueForKey:@"type"];


}

return myType;

}

最佳答案

托管对象属性观察机制将使用访问器来检查新旧值。由于您正在更改 getter 中的值,因此将再次调用 getter,因此您的无限循环开始了。

这种延迟加载实际上不适用于托管对象。您可以在其他地方设置事件类型,例如 awakeFromFetch 或设置 activityTypeName 时,或者如果这不合适,请实现一个单独的访问器:

-(ActivityType*)calculatedActivityType
{
    ActivityType *myType = self.activityType;
    if (myType) return myType;

    NSSet *types = self.myActivityTypes;

    NSSet *foundTypes = [types objectsPassingTest:^BOOL(id obj, BOOL *stop) {
        ActivityType *object = (ActivityType *) obj;

        return ([object.typeName isEqualToString:self.activityTypeName]);

    }];

    myType = [foundTypes allObjects][0];
    self.activityType = myType;
    return myType;
}

这不会导致任何循环,因为您不在任何访问器中。

关于ios - KVO 核心数据和原始访问器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14150654/

相关文章:

ios - NSString stringWithFormat 添加了 "ffffff"

ios - MKMapView 放大后 MKPinAnnotationView 失去 pinColor

ios - Swift 中的类扩展与子类化?

cocoa - 如何在 Mac OSX 上使用 Cocoa 创建类似 OSD 的窗口?

objective-c - 以编程方式更改 OSX 中的用户帐户图像

iphone - 核心数据 - 监视更改并注册本地通知

iphone - 使用 AVAudioPlayer 的音频流

objective-c - 移动后找到文件

iphone - 我可以清除托管对象上下文吗?

ios - 核心数据建议