首页 > 解决方案 > CoreData 是否可以在另一个上下文/后台任务中从一个上下文/线程安全地使用 NSManagedObject

问题描述

是否可以在不同的后台任务之间使用 NSManagedObjects?我有这样的代码,当执行时使用 load() 方法在一个上下文/后台任务上使用 .performBackgroundTask { context 加载 NSManagedObjects

然后我想执行另一个 .performBackgroundTask { context 但问题是 NSManagedObject 似乎不可用,因为从 .performBackgroundTask { 停止返回字段

 self.load(predicate: NSPredicate(format: "company.id = %@", companyId))
            .flatMap { contacts in

                Future { promise in

                    self.storage.persistentContainer.performBackgroundTask { context in

                        let request : NSFetchRequest<Company> = Company.fetchRequest()
                        request.predicate = NSPredicate(format: "id = %@", companyId)

                        let result = try? context.fetch(request)

标签: swiftcore-data

解决方案


我建议您阅读Core Data 并发概述以了解基础知识。
不管你的问题是什么......
你不能直接在上下文/线程之间传递托管对象。
您可以做的是从一个上下文中传递对象 ID,并使用它们从另一个上下文/线程中获取对象。
性能方面,如果有很多对象,这可能不是一个好主意,我建议您performBackgroundTask使用单一上下文在一个中获取合同和公司。load如果您不想公开其逻辑,则可以将上下文作为参数传递给您的函数。


推荐阅读