我的 iPhone 应用程序核心数据属性的自定义访问器方法存在问题。我想做的不仅仅是拉出原始类型并返回它。我有一个可能的活动类型的 NSSet,如果对象没有原始类型,那么我想查看该集合并返回与我的类中的另一个变量匹配的活动类型。
以下是我为此提出的代码。代码的问题是我的调用[self willChangeValueForKey:@"type"]
导致了一个无限循环,程序不断吐出 NSLog“将类型设置为 ...” - 可能是因为我从访问器中调用 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;
}