我一直在尝试解决这个问题一段时间,但无济于事。
从 UserNotification 自定义操作访问托管对象,然后尝试保存对此对象的更改时,我收到以下消息:
[错误] 错误:CoreData:错误:无法调用 NSManagedObject 类“NSManagedObject”上的指定初始化程序。
基本上,设置如下:
1. 用户收到通知
2. 选择自定义操作
3. UserNotification Center Delegate 从通知中的信息中提取对象的 URI,然后从持久存储中提取它
4. 完成后并进行类型转换,委托调用对象上的适当方法
5. 方法返回后委托尝试保存上下文,这就是错误出现的地方。
以下是一些相关代码:
// - UNUserNotification Centre delegate
extension HPBUserNotificationsHandler: UNUserNotificationCenterDelegate {
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
guard let object = getAssociatedObject(id: response.notification.request.identifier) else { return }
switch response.actionIdentifier {
case UNNotificationDismissActionIdentifier:
....
case UNNotificationDefaultActionIdentifier:
....
case HPBReminderAction.take.rawValue:
// get intake object
guard let reminder = object as? HPBIntake else { return }
reminder.take(at: Date())
try! dataController.saveContext() // here is when the error is raised
default:
break
}
completionHandler()
}
从持久存储中提取对象的函数:
func getAssociatedObject(id: String) -> NSManagedObject? {
guard let psc = dataController.managedObjectContext.persistentStoreCoordinator else { return nil }
guard let objURL = URL(string: id) else { return nil }
guard let moid = psc.managedObjectID(forURIRepresentation: objURL) else { return nil }
return dataController.managedObjectContext.object(with: moid)
}
如果我直接在应用程序中对此对象进行相同的更改 - 一切正常。所以我认为问题在于从用户通知的自定义操作中获取对象。但我无法弄清楚是什么问题。
这是一些附加信息。当我reminder在调用take(on:)函数之前检查对象时,它显示为错误:
Home_Pillbox.HPBIntake:0x7fb1a9074e90(实体:Intake;id:0x7fb1a9069e50 x-coredata:///Intake/tAC4BBCD4-B128-4C6F-8E1B-2EE7D4EDBCB34;数据:故障)
当然,当调用函数时,会触发错误,但对象未正确初始化,而是将所有属性填充为nil:
Home_Pillbox.HPBIntake: 0x7fb1a9074e90 (entity: Intake; id: 0x7fb1a9069e50 x-coredata:///Intake/tAC4BBCD4-B128-4C6F-8E1B-2EE7D4EDBCB34 ; data: {dosage = 0; identifier = nil; localNotification = nil; log = nil ; 餐 = 0; medName = nil; notificationRequest = nil; profileName = nil; schedule = nil; status = 1; treatment = nil; unit = 0; userNotes = nil;})
因此,当上下文尝试保存它时,它不能像属性一样nil,这是数据模型所不允许的。还困扰我的是,错误提到了指定的初始化程序,NSManagedObject而不是子类的名称HPBIntake,即使对象的类型明显正确。
任何帮助将不胜感激。
编辑:这是saveContext()DataController 中函数的实现:
func saveContext() throws {
if managedObjectContext.hasChanges {
do {
try managedObjectContext.save()
} catch let syserr as NSError {
throw syserror
}
}
}
