2015-05-13 24 views
5

Ho una classe che mappa direttamente JSON implementando il protocollo Mappable (ObjectMapper Framework) e sto provando ad ereditare da NSManagedObject.Come implementare la classe NSManagedObject conforme a 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"] 

} 
} 

Il problema di questa implementazione è che il compilatore si lamenta del mapping(map) che utilizza auto prima del Super inizializzatore: AbstractModel.swift:19:9: Use of 'self' in method call 'mapping' before super.init initializes self

purtroppo non posso chiamare l'inizializzatore super (super.init(entity: NSEntityDescription, insertIntoManagedObjectContext: NSManagedObjectContext?)) prima mapping(map) perché ho bisogno di self per ottenere il NSManagedObjectContext.

Come posso risolvere questo problema?

+0

non ho familiarità con ObjectMapper, ma un NSManagedObject possono * solo * essere creato utilizzando l'inizializzatore designato. Comunque puoi passare 'context = nil' e inserire l'oggetto in un contesto successivo. –

+1

Grazie, cercherò di implementarlo in questo modo. Ti terrò informato. – VincentS

risposta

6

io non sono sicuro se questa soluzione è il modo corretto per risolvere il problema, ma ho realizzato la mia classe in quel modo e ha funzionato:

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

Ciao ... cosa sono 'DBUtils' e MR_defaultContext nel tuo codice? –

+0

Ciao, DBUtils è una classe Util che restituisce l'attuale ManagedContext e MR_defaultContext() è una classe di MagicalRecord. – VincentS

+1

avete qualche progetto di esempio per questo..interessato sapere come avete impostato le vostre richieste fetchrequests e alamofireObjectMapper..sarà bello se è possibile condividere un prroject campione..thnx –