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

Posted

技术标签:

【中文标题】如何从 Swift 的后台线程中从 CoreData 中获取未保存的数据?【英文标题】:How to fetch unsaved data from CoreData from background thread in Swift? 【发布时间】:2017-04-10 01:33:22 【问题描述】:

我使用以下方法创建了一个 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

Wich 成功完成(耶!)

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

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

现在我收到result.count = 0 :(

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

非常感谢:)

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于如何从 Swift 的后台线程中从 CoreData 中获取未保存的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在后台线程中从 NSFetchedResultsController 加载大数据

如何从后台线程 Swift UI GET 请求发布更改

CoreData 是不是可以在另一个上下文/后台任务中从一个上下文/线程安全地使用 NSManagedObject

如何在 Swift 中从数组中删除一个元素

如何在 Swift 中从数组中提取随机项?

如何在 swift 3 中从核心数据中删除对象