【发布时间】:2018-07-22 18:10:56
【问题描述】:
我正在使用 CoreData,当我尝试在容器的 performBackgroundTask 函数中保存上下文时遇到问题。
我同时从多个地方调用它。我的理解是,每次尝试保存到persistentStore时线程都会不同,从而导致问题。
在遇到以下文章之前,我曾想过使用 childContext 和其他方法:
https://blog.five.agency/how-to-import-a-large-data-set-using-core-data-6c248a503148
文章中coreData栈如下:
final class DataCoordinator {
//MARK: - singleton
static let sharedInstance = DataCoordinator()
//MARK: - init
public var container : NSPersistentContainer
private init() {
container = NSPersistentContainer(name: "Model")
container.loadPersistentStores(completionHandler: { (_, error) in
if let error = error {
fatalError("Unresolved error \(error)")
}
})
}
//MARK: - perform methods
static func performBackgroundTask(_ block: @escaping (NSManagedObjectContext) -> Void) {
DataCoordinator.sharedInstance.container.performBackgroundTask(block)
}
static func performViewTask(_ block: @escaping (NSManagedObjectContext) -> Void) {
block(DataCoordinator.sharedInstance.container.viewContext)
}
}
我的问题是使用这种方法,静态函数 performBackgroundTask 是否会克服这个问题,并且总是在同一个队列上给我相同的背景上下文,或者这与我之前每次使用 container.performBackgroundTask 所做的没有什么不同?
想知道如何在同一个队列中同时从多个位置保存数据?
【问题讨论】:
-
与问题无关,但单例语法繁琐且过时。将
private static var coordinator: DataCoordinator?替换为static let sharedInstance = DataCoordinator()并删除整个sharedInstance()方法。 -
谢谢。我已经更新了我的代码以删除单例。
-
并编辑了代码以反映您的建议