【发布时间】:2017-08-31 18:57:40
【问题描述】:
Core Data 新手,我有两个问题:正确初始化 NSManagedObject 并在便利初始化器和指定初始化器之间保留其值。
我的 AnalyticsEvent NSManagedObject 子类中的代码:
@NSManaged public var eventName: String?
@NSManaged public var type: String?
@NSManaged public var reference: String?
@NSManaged public var timestamp: Double
public required init() {
// Initialize CoreData stack...
let manager = CoreDataManager(modelName: "Analytics", storeName: "Analytics")
// I'm not sure what I should be using to instantiate a new entity here...
// I believe the entity(forEntityName:in:) class method should return an existing value stored in managedObjectContext...
let event = NSEntityDescription.entity(forEntityName: "Event", in: manager.managedObjectContext!)
// ... and insertNewObject(forEntityName:into:) to create a placeholder
// for my new object until I issue saveContext() on managedObjectContext.
// This isn't working right now, so comment out following line
//let event = NSEntityDescription.insertNewObject(forEntityName: "Event", into: database.managedObjectContext!) as! AnalyticsEvent
super.init(entity: event!, insertInto: database.managedObjectContext)
let customProperties = CustomProperties()
self.customPropertiesData = NSKeyedArchiver.archivedData(withRootObject: properties) as Data
self.timestamp = Date().timeIntervalSince1970
}
public convenience init(eventName: String) {
self.init()
// At this point the data set in my designated initializer (above),
// the values have been lost. For example, timestamp == 0
self.eventName = eventName
self.type = EventType.discreteEvent
}
谢谢!
编辑:
进一步调查可能会发现,super.init(entity:insertInto:) 调用可能正在调用我的便利初始化程序,如果是,我不知道它如何找到便利初始化程序的选择器......但它会解释为什么它的值(例如作为时间戳)没有被保留 - 因为它是对象的新实例?!嗯……
编辑 2:
我忘了提到当执行到行时我得到了这个运行时错误:
self.eventName = eventName
CoreData:错误:从上下文中删除托管对象 0x7fa2da54da90 (0x7fa2da54da40)。
【问题讨论】: