Swift CoreData:错误:严重的应用程序错误。 核心数据更改处理期间发生exception。

我正在写一个程序在iOS上,非常我正在面对这个错误:

2015-11-06 10:57:24.289 NETFNET [2503:976392] CoreData:error:严重的应用程序错误。 核心数据更改处理期间发生exception。 这通常是NSManagedObjectContextObjectsDidChangeNotification观察者中的一个错误。 – [__ NSCFSet addObject:]:尝试插入nil与userInfo(空)2015-11-06 10:57:24.293 NETFNET [2503:976392] ***终止应用程序由于未捕获的exception“NSInvalidArgumentException”,原因:' – [ __NSCFSet addObject:]:尝试插入nil'

我想从主线程和后台线程同时访问数据库。 我已经看到很多Objective C的解决scheme,但是没有一个适用于Swift(我不知道Objective C …)。 不幸的是,我不知道如何使用Grand Central Dispatch,事实上,我的程序并不需要几个步骤(我的意思是需要它,但是如果某个线程从一个函数失去一次信息,没有什么不好的发生)。 我只想在Swift 1或2上有稳定的程序,所以我会感谢任何帮助。

您需要创build一个私有队列并发types的私有NSManagedObjectContext,并使用它来在后台线程上操作时访问CoreData。

所以假设我需要在后台运行一个数据库操作,我可以把这个工作分配给后台线程

dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0), { //call your background operation. }) 

然后在后台操作中我可以创build一个私有NSManagedObjectContext为

 let moc = … //Our primary context on the main queue let privateMOC = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType) privateMOC.parentContext = moc privateMOC.performBlock { //operations do { try privateMOC.save() } catch { fatalError("Failure to save context: \(error)") } } 

通过苹果的CoreData并发指南阅读,以在multithreading上实现核心数据操作之前得到一个很好的理解。

很好。 我试了一下,对我来说效果不错。 非常感谢你。

前面的代码:

  do { try CDHelper.shared.context.save() } catch let error as NSError { // Error mesajlarını ekle!! print("Could not fetch \(error), \(error.localizedDescription)") print("Could not fetch \(error), \(error.localizedFailureReason)") } // MARK: - CONTEXT lazy var context: NSManagedObjectContext = { let moc = NSManagedObjectContext(concurrencyType:.MainQueueConcurrencyType) moc.persistentStoreCoordinator = self.coordinator return moc }() // MARK: - MODEL lazy var model: NSManagedObjectModel = { return NSManagedObjectModel(contentsOfURL:self.modelURL)! }() // MARK: - COORDINATOR lazy var coordinator: NSPersistentStoreCoordinator = { return NSPersistentStoreCoordinator(managedObjectModel:self.model) }() lazy var modelURL: NSURL = { let bundle = NSBundle.mainBundle() if let url = bundle.URLForResource("Model", withExtension: "momd") { return url } print("CRITICAL - Managed Object Model file not found") abort() }() 

你应该这样改变代码:

 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)") } })