Ios 作为单例的托管对象上下文?
我的应用程序面临问题,如果我创建或删除一个新对象,然后将该对象保存在另一个实体对象中,然后返回并尝试创建第一个实体类型的新对象,我的应用程序将崩溃 然后,我可以重新打开然后应用程序,使对象崩溃的应用程序没有问题 这一切都是通过核心数据完成的,有一个练习,练习被保存为例程,然后在创建例程后创建一个新的练习将使应用程序崩溃。此外,删除一个练习和一个例行程序,然后立即尝试创建一个新的,也会使应用程序崩溃 我花了很长时间阅读这篇文章,认为可能的原因是托管对象上下文,并想知道将其创建为单例是否是解决方案?我通过在每个VC的viewdidload中运行以下命令来设置MoC:Ios 作为单例的托管对象上下文?,ios,swift,core-data,nsmanagedobjectcontext,Ios,Swift,Core Data,Nsmanagedobjectcontext,我的应用程序面临问题,如果我创建或删除一个新对象,然后将该对象保存在另一个实体对象中,然后返回并尝试创建第一个实体类型的新对象,我的应用程序将崩溃 然后,我可以重新打开然后应用程序,使对象崩溃的应用程序没有问题 这一切都是通过核心数据完成的,有一个练习,练习被保存为例程,然后在创建例程后创建一个新的练习将使应用程序崩溃。此外,删除一个练习和一个例行程序,然后立即尝试创建一个新的,也会使应用程序崩溃 我花了很长时间阅读这篇文章,认为可能的原因是托管对象上下文,并想知道将其创建为单例是否是解决方案?
func getMainContext() -> NSManagedObjectContext {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
return appDelegate.persistentContainer.viewContext
}
然后,我通过.self引用这个VC级别变量,只要我需要引用MoC,就可以避免与在VC中创建进一步的MoC发生冲突
我认为这应该可以防止出现问题,因为所有核心数据工作都与共享MoC相关联。然而,如上所述,仍有碰撞发生
下面是一个控制台打印的崩溃,希望将缩小来源
致命错误:保存上下文失败:错误域=NSCOCAERRORDOMAIN代码=134020“(null)”UserInfo={NSAffectedObjectErrorKey=(实体:UserExecute;id:0x600000025060
下面列出了触发此操作的代码块,例如应用程序中的1个位置,以澄清此操作仅在我刚刚删除其他对象时发生,如果我现在重新加载应用程序,此代码将正常工作并保存:
func createExercise() {
print("SAVE EXERCISE PRESSED")
if userExercise == nil {
print("SAVING THE NEW EXERCISE")
let newUserExercise = UserExercise(context: self.managedObjectContext!)
newUserExercise.name = userExerciseName.text
newUserExercise.sets = Int64(userSetsCount)
newUserExercise.reps = Int64(userRepsCount)
newUserExercise.dateCreated = NSDate()
newUserExercise.hasBeenTickedDone = false
} if self.associatedRoutineToAddTo != nil {
let fetchRequest: NSFetchRequest<UserRoutine> = UserRoutine.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "name == %@", self.associatedRoutineToAddTo!)
do {
let existingUserRoutine = try self.managedObjectContext!.fetch(fetchRequest).first
print("RETRIVED ROUTINES ARRAY CONTAINING \(existingUserRoutine)")
existingUserRoutine?.addToUserexercises(newUserExercise)
print("EXERCISE SUCESSFULLY ADDED TO ROUTINE")
} catch {
print("Fetching Routine Failed")
}
} else if self.associatedRoutineToAddTo == nil {
print("THIS IS A FRESH EXERCISE WITHOUT A PARENT ROUTINE")
}
} else if let userExercise = userExercise {
print("UPDATING THE EXISTING EXERCISE")
userExercise.name = userExerciseName.text
userExercise.sets = Int64(userSetsCount)
userExercise.reps = Int64(userRepsCount)
}
do {
try self.managedObjectContext?.save()
print("THE EXERCISE HAS BEEN SAVED")
} catch {
fatalError("Failure to save context: \(error)")
}
我收到“NSCOCAERRORDOMAIN Code=134020(null)”错误,因为我的新实体未添加到正确的CoreData配置中。我收到的是“NSCOCAERRORDOMAIN Code=134020(null)”错误,因为我的新实体未添加到正确的CoreData配置中。您的模型中是否定义了任何强制属性?您的模型中是否定义了任何其他约束?所有内容都是可选的,因此我认为这可能不是原因,已经检查过了!您是否始终在主线程上运行?我假设是这样,我不知道i don’我不太了解线程核心数据,你有没有在模型中定义的强制属性?你有没有在模型中定义的其他约束?一切都是可选的,所以我不认为这可能是原因,已经检查过了!你总是在主线程上运行吗?我假设是这样,我没有设置它还有别的吗?我对线程coredata不太了解
var managedObjectContext: NSManagedObjectContext!
var userExercise: UserExercise?
var associatedRoutineToAddTo : String?
var editingUserExerciseID: NSManagedObjectID?
var editingUserExercise: UserExercise?