Core Data NSTimeInterval que usa un acceso directamente es cochecito

Estoy configurando un NSTimeInterval usando setValueForKey dentro de una subclass NSManagedObject, el valor se establece correctamente, y también es correcto cuando se recupera usando valueForKey; sin embargo, si un accessor se usa directamente, devuelve un valor incorrecto. Aquí hay un ejemplo de código que demuestra el problema.

let date = NSDate() //NSTimeIntervalSince1970 = 1447054145.15281 self.setValueForKey(date, "dateLastSynced") self.valueForKey("dateLastSynced") //= 1447054145.15281 self.dateLastSynced // !!ERROR Incorrect value = 468746945.152815 

Curiosamente, si dateLastSynced se convierte en un NSDate, todo funciona a la perfección.

¿Alguna idea de lo que está sucediendo?

Una propiedad escalar del tipo NSTimeInterval para una propiedad de Date datos del núcleo representa el time en segundos desde la date de reference del 1 de enero de 2001. Los methods de acceso generados por los datos del núcleo se convierten de manera transparente entre NSTimeInterval y NSDate .

Por lo tanto, establece un valor con el acceso escalar con

 obj.dateLastSynced = date.timeIntervalSinceReferenceDate 

y recuperas el valor con

 let date = NSDate(timeIntervalSinceReferenceDate: obj.dateLastSynced) 

Esto da los mismos resultados que los methods de encoding de valor key

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

Asignar a self.valueForKey("dateLastSynced") no funcionará; no es un lvalue Necesitas usar setValueForKey .

Además, si dateLastSynced es una propiedad de date, no puede asignarle un double valor y esperar que funcione. Utilizar

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