核心数据NSTimeInterval直接使用访问器是错误的
我在NSManagedObject子类中使用setValueForKey设置NSTimeInterval,值设置正确,并且在使用valueForKey检索时也正确,但是,如果直接使用访问器,则返回不正确的值。 这是一个演示该问题的代码示例
let date = NSDate() //NSTimeIntervalSince1970 = 1447054145.15281 self.setValueForKey(date, "dateLastSynced") self.valueForKey("dateLastSynced") //= 1447054145.15281 self.dateLastSynced // !!ERROR Incorrect value = 468746945.152815
奇怪的是,如果dateLastSynced转换为NSDate,一切都很完美。
关于什么事情发生的任何想法?
Core Data Date
属性的NSTimeInterval
类型的标量属性表示自引用日期2001年1月1日以来的秒数。核心数据生成的访问器方法在NSTimeInterval
和NSDate
之间透明地转换。
因此,您使用标量访问器设置值
obj.dateLastSynced = date.timeIntervalSinceReferenceDate
并使用。 检索值
let date = NSDate(timeIntervalSinceReferenceDate: obj.dateLastSynced)
这给出了与键值编码方法相同的结果
// Set: obj.setValueForKey(date, "dateLastSynced") // Get: let date = obj.valueForKey("dateLastSynced")
分配给self.valueForKey("dateLastSynced")
将不起作用; 这不是lvalue
。 您需要使用setValueForKey
。
此外,如果dateLastSynced
是日期属性,则无法为其指定double
值并期望它可以正常工作。 使用
self.setValue(NSDate(timeIntervalSinceReferenceDate: ), forKey:"dateLastSynced")