由于 NSManagedObjectContextObjectsDidChangeNotification 导致的运行时错误
Posted
技术标签:
【中文标题】由于 NSManagedObjectContextObjectsDidChangeNotification 导致的运行时错误【英文标题】:Runtime Error due to NSManagedObjectContextObjectsDidChangeNotification 【发布时间】:2017-07-31 11:03:46 【问题描述】:我遇到了这个运行时错误,它在刷新数据或启动时(从服务获取并保存在 coreData)中发生 50% 的时间。我已经浏览了几乎所有关于这个问题的解决方案,但其中大多数都在 Obj-C 中,但我是 ios 新手并且使用 swift。我有大约 20 个表,并且都使用相同的上下文。
下面是我的代码:
public class ServiceCalls : NSManagedObject
/*
class func getContext () -> NSManagedObjectContext
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let moc = NSManagedObjectContext(concurrencyType:.mainQueueConcurrencyType)
let privateMOC = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
privateMOC.parent = moc
privateMOC.perform(
do
try privateMOC.save()
catch
fatalError("Failure to save context: \(error)")
)
return appDelegate.persistentContainer.viewContext
*/ // tried this but didn't work
class func getContext () -> NSManagedObjectContext
let appDelegate = UIApplication.shared.delegate as! AppDelegate
return appDelegate.persistentContainer.viewContext
这就是我的使用方式,下面只是将数据保存在数据库中的一个示例。
class func SaveCustomerContacts(name : String,id : String)
let context = getContext()
let entity = NSEntityDescription.entity(forEntityName: "AllCustomerContacts_Tbl", in: context)
let newDoc = NSManagedObject(entity: entity!, insertInto: context)
newDoc.setValue(name, forKey: "contactName")
newDoc.setValue(id, forKey: "id")
//save the object
do
try context.save()
print("saved Customer contacts in Database yayy!")
catch let error as NSError
print("Could not save \(error), \(error.userInfo)")
catch
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
这是抛出的完整异常:
[error] error: Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. -[__NSCFSet addObject:]: attempt to insert nil with userInfo (null)
CoreData: error: Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. -[__NSCFSet addObject:]: attempt to insert nil with userInfo (null)
2017-07-31 16:09:20.908 Sales CRM[5846:202190] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFSet addObject:]: attempt to insert nil'
*** First throw call stack:
【问题讨论】:
你有任何 fetchedResultsController 设置吗?你有 NSManagedObjectContextObjectsDidChangeNotification 的观察者吗? @JonRose 不,我没有在任何地方使用 NSManagedObjectContextObjectsDidChangeNotification。也没有 fetchedResultsController 设置。 两个问题:(1)你在任何地方观察NSManagedObjectContextObjectsDidChangeNotification
吗? (2) 这段代码运行在什么队列上?
@TomHarrington 不,我没有在代码中的任何地方使用 NSManagedObjectContextObjectsDidChangeNotification。
@TomHarrington 我没有在我的代码中提到任何队列,我应该这样做吗?
【参考方案1】:
错误表明正在插入一些nil
值。
[error] error: Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. -[__NSCFSet addObject:]: attempt to insert nil with userInfo (null)
CoreData: error: Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. -[__NSCFSet addObject:]: attempt to insert nil with userInfo (null)
2017-07-31 16:09:20.908 Sales CRM[5846:202190] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFSet addObject:]: attempt to insert nil'
*** First throw call stack:
这个问题可能有多种原因:
-
您正在使用多个上下文并且没有正确处理它们。
您正试图在后台保存并发类型为
MainQueueConcurrencyType
的上下文。请改用PrivateQueueConcurrencyType
。
保存的值是nil
或某种错误数据(在关系中)。
【讨论】:
有了你的解决方案和这个链接developer.apple.com/library/content/documentation/Cocoa/…我成功了,谢谢Gp! 太棒了!快乐编码:)以上是关于由于 NSManagedObjectContextObjectsDidChangeNotification 导致的运行时错误的主要内容,如果未能解决你的问题,请参考以下文章
CoreData 和 NSManagedObjectContext
多个 NSManagedObjectContext 或传递它?
在后台线程上初始化 NSManagedObjectContext 和 NSPersistentStoreCoordinator
Restkit 核心数据与 NSManagedObjectContext 集成