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,一切正常。
对发生的事情有什么想法吗?
- 它属于 NSTimeInterval 类型。我通过在生成时检查使用标量属性来生成类。奇怪的是,如果我手动将类型设置为 NSDate,它可以工作,但我需要使用 NSTimeInterval。有任何想法吗?
Core Data Date 的 NSTimeInterval 类型的标量属性
属性表示自参考日期以来的时间(以秒为单位)
2001 年 1 月 1 日。Core Data 透明地生成访问器方法
在 NSTimeInterval 和 NSDate.
之间转换
因此,您使用带有
的标量访问器设置一个值
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") |
-
如果我使用访问器设置时间间隔但时间间隔是自 1970 年以来,这是否是相同的行为?换句话说,使用 timeIntervalSinceReferenceDate 创建 NSDate 是否安全,无论您是使用 KVC 还是直接使用访问器设置它?
-
@SalmanHasratKhan:我不确定我是否理解您的问题,但如何创建 NSDate 对象并不重要。一旦创建,它就是一个绝对时间点(并且在内部使用自 2001 年 1 月 1 日以来的秒数作为表示)。
-
我的意思是,可以说在我的应用程序的某个地方,我设置了 event.dateLastSynced = NSDate().timeIntervalSince1970,在我的代码的其他一些部分我使用 KVC 设置它,所以在任何地方重建日期时是否安全应用程序使用 NSDate(timeIntervalSinceReferenceDate)?
-
@SalmanHasratKhan: event.dateLastSynced = NSDate().timeIntervalSince1970 是错误的。您必须使用 event.dateLastSynced = NSDate().timeIntervalSinceReferenceDate 来获得一致的结果。
-
很棒的人,我真的把头发拉了出来,这似乎很管用!非常感谢!!!
分配给 self.valueForKey("dateLastSynced") 将不起作用;它不是 lvalue。您需要使用 setValueForKey。
另外,如果 dateLastSynced 是一个日期属性,你不能给它一个 double 值并期望它工作。使用
1
| self.setValue(NSDate(timeIntervalSinceReferenceDate: <value>), forKey:"dateLastSynced") |
- 如果您注意到我的代码示例,我正在使用 setValueForKey,而且,我设置的日期不是双精度,所以这些不是问题,关于 else 的任何想法是错误的吗?
-
我指的是您的代码在编辑之前的样子。但是,我认为 Martin R. 现在已经解释过了。
-
在编辑之前,我的问题已经有了您在评论中建议的更改。这就是为什么您的答案不起作用但马丁斯起作用的原因。