我对initWithEntity:insertIntoManagedObjectContext:
有点困惑。
根据{{3}}(两阶段初始化),我应该在初始化子类的所有新属性后调用super.init
。
但是,当我使用以下代码执行此操作时,我收到错误:
//In subclass of NSManagedObject
init(entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?, origin: NavCoordinate, destination:NavCoordinate, city: String, averageSpeedKmPH:NSNumber, client:String)
{
self.origin = origin
self.destination = destination
self.city = city
self.averageSpeedKmPH = averageSpeedKmPH
self.client = client
super.init(entity: entity, insertIntoManagedObjectContext: context)
}
问题是我收到错误:" Super.init在初始化程序中被多次调用"
如果我先调用super.init...
而不是它。
Swift documentation的文档也说:
如果覆盖initWithEntity:insertIntoManagedObjectContext:,则必须确保将self设置为调用super实现的返回值,如以下示例所示:
但没有任何例子。
覆盖initWithEntity:insertIntoManagedObjectContext:
的正确方法是什么?
答案 0 :(得分:2)
init(entity entity: NSEntityDescription,
insertIntoManagedObjectContext context: NSManagedObjectContext?)
的文档说
不鼓励你覆盖这个方法 - 你应该改为覆盖awakeFromInsert和/或awakeFromFetch(如果这些方法有共同的逻辑,那么它应该被考虑到从两者中调用的第三个方法)。如果您在此方法中执行自定义初始化,则可能会导致撤消和重做操作出现问题。
正确的方法是覆盖awakeFromInsert而不是init。
答案 1 :(得分:-1)
我决定首先调用insertNewObjectForEntityForName
,然后在实体上调用setup
。这似乎是最好的解决方案,因为这样你就不会破坏Swift Two-Phase Initialization并支持核心数据undo,redo。
let journey = NSEntityDescription.insertNewObjectForEntityForName("JourneyEntity", inManagedObjectContext: moc) as! Journey
journey.setupJourney(origin, destination: destination, city: city, averageSpeedKmPH: self.user.averageSpeedKmPH, client:client)