问题描述
我不确定我在做什么错,但是由于这个原因,我的应用程序崩溃了。这是我在AppDelegate中的coredata堆栈,如下所示。
lazy var viewContext: NSManagedObjectContext = {
return self.persistentContainer.viewContext
}()
lazy var cacheContext: NSManagedObjectContext = {
return self.persistentContainer.newBackgroundContext()
}()
lazy var updateContext: NSManagedObjectContext = {
let _updateContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
_updateContext.parent = self.viewContext
return _updateContext
}()
然后我创建了一个Singleton类来管理我的CoreData操作。
class StorageManager:NSObject {
private override init() {}
private static var SMInstance: StorageManager?
public static var shared : StorageManager {
if SMInstance == nil {
SMInstance = StorageManager()
}
return SMInstance!
}
//Represent a single context for all the operations with lazy loading
lazy var managedObjectContext : NSManagedObjectContext = {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
return appDelegate.viewContext
}()
lazy var privateMOC : NSManagedObjectContext = {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
return appDelegate.updateContext
}()
private func synchronize() {
do {
try self.privateMOC.save()
self.managedObjectContext.performAndWait {
do {
try self.managedObjectContext.save()
print("Saved to main context")
} catch {
print("Could not synchonize data. \(error),\(error.localizedDescription)")
}
}
} catch {
print("Could not synchonize data. \(error),\(error.localizedDescription)")
}
}
}
将数据保存到同一类中的示例保存方法如下。但这有时会给我这个错误
***由于未捕获的异常'NSGenericException'而终止应用程序, 原因:'***集合<__ nscfset>在 被枚举...
func savedata() {
DispatchQueue.main.async(execute: {
let entity = User(context: self.privateMOC)
entity.name = "JOHN PAUL"
//IT crash here
self.privateMOC.performAndWait {
self.synchronize()
}
})
}
解决方法
此错误可能是因为您正在后台上下文中创建User
实体,但在主线程上执行了操作。
删除DispatchQueue.main.async
。
有关核心数据和线程的更多信息,请阅读here。
编辑:在私有/背景上下文中创建对象/实体应该是这样的:
let privateMOC = self.privateMOC
privateMOC.performAndWait {
let entity = User(context: privateMOC)
entity.name = "JOHN PAUL"
self.synchronize(privateMOC: privateMOC)
}
此外,同步功能应如下所示:
private func synchronize(privateMOC: NSManagedObjectContext) {
do {
try privateMOC.save()
DispatchQueue.main.async {
self.managedObjectContext.performAndWait {
do {
try self.managedObjectContext.save()
print("Saved to main context")
} catch {
print("Could not synchonize data. \(error),\ (error.localizedDescription)")
}
}
}
} catch {
print("Could not synchonize data. \(error),\(error.localizedDescription)")
}
}