2017-04-10 2 views
1

habe ich eine NSManagedObjectContext mit:Wie kann man nicht gespeicherte Daten von CoreData aus dem Hintergrundthread von Swift holen?

lazy var managedObjectContext: NSManagedObjectContext = { 
    let coordinator = self.persistentStoreCoordinator 
    var managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType) 
    managedObjectContext.persistentStoreCoordinator = coordinator 
    return managedObjectContext 
}() 

Dann habe ich einen API-Aufruf mit AlamoFire und in der Callback machen Ich versuche, die Eltern zu retten:

let objectDescription = NSEntityDescription.entity(forEntityName: "Parent", in: managedObjectContext) 
var managedObject = NSManagedObject(entity: objectDescription!, insertInto: managedObjectContext) as? Parent 

Wich erfolgreich abgeschlossen (yay!)

Dann mache ich einen API-Aufruf, um ihre Kinder zu bekommen und im Rückruf versuche ich, die Eltern zu holen, um sie zu verknüpfen:

let fetchRequest:NSFetchRequest<Parent> = NSFetchRequest<Parent>(entityName: "Parent") 
fetchRequest.includesPendingChanges = true 
let result = try managedObjectContext.fetch(fetchRequest) 

Jetzt bin immer ich result.count = 0 :(

Diese beiden Operationen in Coredata verschiedenen Threads auftreten, und ich finde, dass das das Problem ist ... Ist es wirklich? Wie löse ich das?

Vielen Dank :)

Antwort

0

Der verwaltete Objektkontext bezeichnet wird oft als „Notizblock“. Alle Änderungen, die Sie daran vornehmen, werden nur gespeichert, bis Sie sie speichern(). Auch nach einem speichern, wenn Ihr Kontext einen übergeordneten Kontext hat, noch diese Änderungen möglicherweise nicht die tatsächliche DB getroffen, bis dass Elternkontext speichert, usw.

Also ja, auf mehreren Threads Core Data Manipulation ist das, was verursacht, dein Problem. Die übliche Lösung besteht darin, einen einzelnen Hintergrundkontext zu verwenden, um Änderungen, die Sie von einem Server erhalten, dauerhaft zu erhalten, sodass diese Änderungen serialisiert werden.

Verwandte Themen