我在我的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