覆盖initWithEntity:insertIntoManagedObjectContext:

时间:2015-11-15 18:35:03

标签: ios swift core-data initialization nsmanagedobject

我对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:的正确方法是什么?

2 个答案:

答案 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)