我在我的NSManagedObject上使用了一些Transient属性来预先计算只需要在依赖属性更新时计算一次的事情,但是当我重置Transient属性时永远不会保存的值。setPrimitiveValue for Transient property not saved
例如:
-(NSString*)age {
// notify core data to access value
[self willAccessValueForKey:@"age"];
// get primitive value
NSString* age = [self primitiveValueForKey:@"age"];
// is age already exist?
if (age == nil) {
// get age
age = [GlobalHelper convertToAgeStringWithUTCDateOfBirth:(NSString*)self.dateOfBirth];
// set primitive value
[self setPrimitiveValue:age forKey:@"age"];
}
// notify core data done access value
[self didAccessValueForKey:@"age"];
return age;
}
-(void)setDateOfBirth:(id)dateOfBirth {
// change value for key
[self willChangeValueForKey:@"dateOfBirth"];
[self willChangeValueForKey:@"age"];
// set primitive
[self setPrimitiveValue:dateOfBirth forKey:@"dateOfBirth"];
[self setPrimitiveValue:nil forKey:@"age"];
// did change value for key
[self didChangeValueForKey:@"age"];
[self didChangeValueForKey:@"dateOfBirth"];
}
所以你可以从上面的代码中看到,当我同步此对象,当“出生日期”字段更新它尝试设置“年龄”为“零”,当访问“年龄”字段,如果它是“无”,那么计算年龄并不再计算它。
然而,问题是当我在“setDateOfBirth”中将“age”字段设置为“nil”时,它从来没有保存过,当我再次访问年龄时,“age”属性仍然具有以前的值,但“dateOfBirth”已更新。
任何远程与此主题有关的帮助将是非常赞赏,我有这个大麻烦......
编辑:我上面有逻辑的作品完美的方案,其中从相同的两个setter和getter电话上下文(相同的线程上下文),问题只发生在setter从具有专用队列的AFNetworking API的完成块中调用并且合并后从主线程调用的getter时。
看来,当我从AFNetworking完成块的上下文中保存时,它只保存dateOfBirth,但不保存dateOfBirth,它在合并后设置为零,并且当来自主线程“age”的getter调用具有先前的值时它永远不会再计算。
你刚才说年龄是一个短暂的财产,你为什么期望它被保存? – Rog
瞬态属性不会保存到存储器中,但会保存到内存上下文中,并且可以在https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreData/Articles/cdNSAttributes中很好地解释瞬态属性的用途。 html – andykkt
您需要在保存这些记录的位置发布代码的一部分。它可能是一个管理对象上下文跨越线程的问题,或者将更改与瞬态属性合并(详见本页底部的详细信息)https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreData/Articles /cdUsingMOs.html) – Rog