【发布时间】:2018-05-30 09:51:41
【问题描述】:
在我的应用程序中,我有一个特殊的 CoreDataManager 类,它负责我的应用程序中的所有核心数据操作。
CoreDataManager 类中的第一行如下所示:
static var sharedInstance: CoreDataManager = { // or private static var
let instance = CoreDataManager()
return instance
}()
// Init
override init() {
self.persistentContainer = NSPersistentContainer.init(name: "AppName")
self.persistentContainer.loadPersistentStores { (storeDescription, error) in
if let error = error as NSError? {
fatalError("CoreDataManager: init, loadPersistentStores error: \(error), \(error.userInfo)")
} else {
print("CoreDataManager: init() func finished with Success!")
}
}
self.persistentContainer.viewContext.undoManager = nil
self.persistentContainer.viewContext.shouldDeleteInaccessibleFaults = true
self.persistentContainer.viewContext.automaticallyMergesChangesFromParent = true
}
let persistentContainer: NSPersistentContainer
var viewContext: NSManagedObjectContext? {
return self.persistentContainer.viewContext
}
func saveViewContext() {
let context = self.viewContext
if self.viewContext != nil {
if context!.hasChanges {
do {
try context!.save()
} catch {
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
}
}
}
当我需要在我的应用程序中保存、编辑或删除核心数据实体时,我会调用 CoreDataManager 类的单例,以及在该类中声明的(保存、编辑、删除实体)方法。
在我的应用程序中,我还有一个 LocalNotificationManager,当我收到来自 CloudKit 的更改或删除某些实体时,我会在其中对 CoreData 实体进行一些操作。当我想保存更改时,我打电话给CoreDataManager.sharedInstance.saveViewContext(),并且“认为我做错了,因为有时我会出错。
不清楚如何正确调用context并保存,有以下疑问:
在我的保存、编辑、删除调用中,我应该使用/保存 mainContext 还是 privateContext?
收到通知后,我应该使用/保存 mainContext 还是 privateContext?
什么时候应该从主线程保存 viewContext,什么时候使用私有托管对象上下文?我应该使用 .MainQueueConcurrencyType 还是可以避免?
我应该在我的 CoreDataManager 类中声明一个 privateObjectContext 变量吗?这样做的正确方法是什么?
我已经看到可以通过这种方式声明私有上下文,但是我可以在我的 CoreDataManager 类中实现它吗?什么时候应该调用它而不是 saveViewContext()。
let moc = NSManagedObjectContext(concurrencyType:.MainQueueConcurrencyType)
let privateMOC = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
privateMOC.parentContext = moc
privateMOC.performBlock({
do {
try privateMOC.save()
} catch {
fatalError("Failure to save context: \(error)")
}
})
谁能解释清楚在不同情况下保存上下文的正确用法?
Swift 4,Xcode 9。
【问题讨论】:
-
privateObjectContext 用于在后台线程上使用上下文,除非您看到性能问题或 UI 锁定您在主线程上使用标准 viewContext 的罚款。
标签: ios swift core-data concurrency nsmanagedobjectcontext