关于 ios:Core Data NSTimeInterval 直接使用访问器是错误的

Core Data NSTimeInterval using an accessor directly is buggy

我正在使用 NSManagedObject 子类中的 setValueForKey 设置 NSTimeInterval,该值被正确设置,并且在使用 valueForKey 检索时也是正确的,但是,如果直接使用访问器,它会返回不正确的值。这是一个演示问题的代码示例

1
2
3
4
5
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 DateNSTimeInterval 类型的标量属性
属性表示自参考日期以来的时间(以秒为单位)
2001 年 1 月 1 日。Core Data 透明地生成访问器方法
NSTimeIntervalNSDate.

之间转换

因此,您使用带有

的标量访问器设置一个值

1
obj.dateLastSynced = date.timeIntervalSinceReferenceDate

然后你用

检索值

1
let date = NSDate(timeIntervalSinceReferenceDate: obj.dateLastSynced)

这给出了与键值编码方法相同的结果

1
2
3
4
// Set:
obj.setValueForKey(date,"dateLastSynced")
// Get:
let date = obj.valueForKey("dateLastSynced")


分配给 self.valueForKey("dateLastSynced") 将不起作用;它不是 lvalue。您需要使用 setValueForKey

另外,如果 dateLastSynced 是一个日期属性,你不能给它一个 double 值并期望它工作。使用

1
self.setValue(NSDate(timeIntervalSinceReferenceDate: <value>), forKey:"dateLastSynced")