托管对象上下文作为单例?
Posted
技术标签:
【中文标题】托管对象上下文作为单例?【英文标题】:Managed Object Context as Singleton? 【发布时间】:2017-02-22 11:22:18 【问题描述】:我的应用程序遇到问题,如果我创建或删除一个新对象,然后将该对象保存在不同的实体对象中,然后返回并尝试创建第一个实体类型的新对象,我的应用程序将崩溃.
然后我可以重新打开应用程序并制作使应用程序崩溃的对象没有问题。
这都是通过核心数据完成的,有一个练习,练习保存为一个例程,然后在创建一个例程后创建一个新的练习会导致应用程序崩溃。此外,删除一个练习和一个例程然后尝试创建一个新的例程也会导致应用崩溃
我花了很长时间阅读这方面的内容,并认为可能的原因是托管对象上下文,并且想知道将其创建为单例是否是解决方案?我通过在每个 VC 的 viewdidload 中运行以下命令来设置 MoC:
func getMainContext() -> NSManagedObjectContext
let appDelegate = UIApplication.shared.delegate as! AppDelegate
return appDelegate.persistentContainer.viewContext
然后我通过 .self 引用这个 VC 级别变量,只要我需要引用 MoC 以避免与在 VC 中创建更多 MoC 发生冲突。
我认为这应该可以防止出现问题,因为所有核心数据工作都与共享 MoC 相关联。但是,如上所述,仍然会发生崩溃。
下面是崩溃的控制台打印,希望能缩小来源。
致命错误:未能保存上下文:Error Domain=NSCocoaErrorDomain Code=134020 "(null)" UserInfo=NSAffectedObjectsErrorKey= (entity: UserExercise; 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)")
变量声明为:
var managedObjectContext: NSManagedObjectContext!
var userExercise: UserExercise?
var associatedRoutineToAddTo : String?
var editingUserExerciseID: NSManagedObjectID?
var editingUserExercise: UserExercise?
【问题讨论】:
您的模型中是否有任何强制属性定义?您的模型中是否定义了任何其他约束? 一切都是可选的,所以我认为这不是一个原因,已经检查过了! 你一直在主线程上运行吗? 我假设是这样,我没有设置它是什么?我对线程核心数据不太了解 【参考方案1】:我收到“NSCocoaErrorDomain Code=134020 (null)”错误,因为我的新实体未添加到正确的 CoreData 配置中。
【讨论】:
以上是关于托管对象上下文作为单例?的主要内容,如果未能解决你的问题,请参考以下文章