托管对象上下文为单身?

时间:2017-02-22 11:22:18

标签: ios swift core-data nsmanagedobjectcontext

我面临着我的应用程序的问题,如果我创建或删除一个新对象,然后将对象保存在另一个实体对象中,然后返回并尝试创建第一个实体类型的新对象,我的应用程序将崩溃。

然后,我可以重新打开应用程序并使对象崩溃应用程序没有问题。

这一切都是通过核心数据完成的,有一个练习,练习被保存为例程,然后在创建例程后创建一个新的练习会使应用程序崩溃。此外,删除练习和例程然后尝试直接创建新练习也会使应用程序崩溃

我花了很长时间阅读这篇文章并相信可能的原因是托管对象上下文,并想知道将其创建为单例是否是解决方案?我通过在每个VC的viewdidload中运行以下来设置MoC:

func getMainContext() -> NSManagedObjectContext {
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    return appDelegate.persistentContainer.viewContext
}

然后我通过.self引用这个VC级变量,无论我需要引用MoC,以避免在VC中创建更多MoC时发生冲突。

我认为这可以防止问题,因为所有核心数据工作都与共享的MoC相关联。但是,如上所述,仍然会发生崩溃。

下面是崩溃的控制台打印,希望能缩小来源。

  

致命错误:无法保存上下文:错误域= NSCocoaErrorDomain代码= 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 个答案:

答案 0 :(得分:0)

我收到“ NSCocoaErrorDomain代码= 134020(空)”错误,因为我的新实体未添加到正确的CoreData配置中。