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

标签 ios swift multithreading core-data nsfetchrequest

我使用以下方法创建了一个 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 来获取他们的 child ,并在回调中尝试获取 parent 以便链接他们:

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

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

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

非常感谢:)

最佳答案

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

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

关于ios - 如何从 Swift 中的后台线程从 CoreData 中获取未保存的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43313803/

相关文章:

ios - 全屏模式下的 MPMoviePlayerController,完成按钮导致播放器暂停播放

ios - 像 Strava 这样的应用程序如何在 iPhone 上继续在后台运行?

ios - 当点击以编程方式创建的 UIButton 时,是否可以推送到可在界面生成器中编辑的 Controller ?

swift - 具有泛型和特化的协议(protocol)

iphone - Objective-C 中关于 "property"的一些困惑

ios - 如何在 Swift3 中执行 timeIntervalSinceNow?

ios - 使用 reachabilitySwift 检查互联网连接或 wifi 连接

java - 确定同步范围?

c++ - 从使用异步启动的方法回调的最优雅方式

java - 如何立即强制终止 ThreadPoolExecutor 中的所有 worker