如何在 Swift 中从后台线程从 CoreData 获取未保存的数据?

问题描述 投票:0回答:1

我使用以下方法创建了一个 NSManagedObjectContext:

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

然后我使用 AlamoFire 进行 API 调用,并在回调中尝试保存父级:

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

成功完成(耶!)

然后我进行 API 调用来获取他们的孩子,并在回调中尝试获取父母以链接它们:

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

现在我得到了

result.count = 0

这两个 CoreData 操作发生在不同的线程中,我觉得这就是问题所在......真的吗?我该如何解决这个问题?

非常感谢

ios swift multithreading core-data nsfetchrequest
1个回答
0
投票

托管对象上下文通常被称为“便笺簿”。您对其所做的任何更改都仅存在于内存中,直到您 save() 它们为止。即使在保存之后,如果您的上下文有父上下文,这些更改仍然可能不会到达实际的数据库,直到that父上下文保存,等等。

所以是的,在多个线程上操作核心数据是导致您的问题的原因。通常的解决方案是使用单个后台上下文来保存从服务器返回的更改,以便这些更改相互序列化。

© www.soinside.com 2019 - 2024. All rights reserved.