由于 NSManagedObjectContextObjectsDidChangeNotification 导致的运行时错误
Runtime Error due to NSManagedObjectContextObjectsDidChangeNotification
我被这个 运行 时间错误困住了,它在刷新数据或启动时(从服务中获取并保存在 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:
错误表明正在插入一些 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
或某种错误数据(在关系中)。
我被这个 运行 时间错误困住了,它在刷新数据或启动时(从服务中获取并保存在 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:
错误表明正在插入一些 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
或某种错误数据(在关系中)。