2015-05-13 3 views
5

У меня есть класс, который напрямую отображает JSON, реализующий протокол Mappable (ObjectMapper Framework), и я пытаюсь наследовать от NSManagedObject.Как реализовать класс NSManagedObject, соответствующий Mappable

class AbstractModel: NSManagedObject, Mappable { 

@NSManaged var uuid: String? 
@NSManaged var updatedAt: String? 
@NSManaged var createdAt: String? 

required init?(_ map: Map) { 
    mapping(map) 
} 

func mapping(map: Map) { 
    uuid  <- map["uuid"] 
    updatedAt <- map["updatedAt"] 
    createdAt <- map["createdAt"] 

} 
} 

Проблема с этой реализацией является то, что компилятор жалуется на mapping(map), который использует себя перед супер инициализатором: AbstractModel.swift:19:9: Use of 'self' in method call 'mapping' before super.init initializes self

К сожалению, я не могу назвать супер инициализатору (super.init(entity: NSEntityDescription, insertIntoManagedObjectContext: NSManagedObjectContext?)), прежде чем mapping(map) потому что мне нужен self для получения NSManagedObjectContext.

Как я могу решить эту проблему?

+0

Я не знаком с ObjectMapper, но NSManagedObject может * только * создается с помощью назначенного инициализатора. Однако вы можете передать 'context = nil' и вставить объект в контекст позже. –

+1

Спасибо, я постараюсь реализовать его таким образом. Я буду держать вас в курсе. – VincentS

ответ

6

Я не уверен, если это решение является правильным способом решить эту проблему, но я реализовал свой класс, путь, и она работала:

class AbstractModel: NSManagedObject, Mappable { 

@NSManaged var uuid: String? 
@NSManaged var updatedAt: String? 
@NSManaged var createdAt: String? 

override init(entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?) { 
    super.init(entity: entity, insertIntoManagedObjectContext: DBUtils().getManagedObjectContext()) 
} 

required init?(_ map: Map) { 
    var ctx = NSManagedObjectContext.MR_defaultContext() 
    var entity = NSEntityDescription.entityForName("AbstractModel", inManagedObjectContext: ctx) 
    super.init(entity: entity!, insertIntoManagedObjectContext: ctx) 

    mapping(map) 
} 

func mapping(map: Map) { 
    uuid  <- map["uuid"] 
    updatedAt <- map["updatedAt"] 
    createdAt <- map["createdAt"] 

} 
} 
+0

Привет ... что такое «DBUtils» и MR_defaultContext в вашем коде? –

+0

Привет, DBUtils - это класс Util, который возвращает текущий ManagedContext, а MR_defaultContext() - это класс из MagicalRecord. – VincentS

+1

у вас есть образец проекта для этого..интересно знать, как вы настроили свои fetchrequests и alamofireObjectMapper звонки .. будет здорово, если вы можете поделиться образцом prroject..thnx –

Смежные вопросы