应用程序返回前景时CoreData保存上下文导致崩溃。迅速

时间:2016-06-02 21:37:59

标签: ios xcode swift core-data nsmanagedobjectcontext

好的,所以我遇到了一个令人沮丧的问题,我希望得到一些帮助或建议。基本上我有一个我正在开发的应用程序,利用Core Data存储大量用户属性。我在开发过程中几个月来一直在做的是,只要用户从活动状态转换到后台,我就会保存managedObjectContext。我使用了一些后台获取请求,因此我被告知要专门使用applicationDidEnterBackground中的AppDelegate而不是applicationWillTerminate函数。基本上我做了类似的事情:

func applicationDidEnterBackground(application: UIApplication) {

    if !userSaved {
        saveUserDataLocally()
    }

}

func saveUserDataLocally() {

    // Handle all the data, store it properly in managedObjectContext
    // .........
    // .......
    do {
        try managedObjectContext.save()
        print("Success on save")
    } catch let error {
        print("Error saving user \(error)")
    }

}

现在,当我通过xCode在iPhone上测试应用程序时,这已经好几个月了。每当我将应用程序推入后台时它仍然可以正常工作,并等待几秒钟以保存到managedObjectContext完成(如果存储了大量数据,有时可能需要3-4秒) 。只有当我通过xCode测试应用程序时才会出现问题。因此,如果我在手机上安装了应用程序,并且在乘坐公共汽车去学校时尝试测试,我会遇到问题。当我将应用程序推入后台模式时,它只会导致崩溃,然后立即点击主屏幕上的应用程序图标再次启动它(好像我不小心点击了主页按钮将其推入后台) 。如果我没有通过xCode测试并尝试强制退出应用程序,情况也是如此。在这种情况下,它不会因为应用程序没有运行而崩溃,但它永远不会完成保存。

我已经不知疲倦地尝试重新解决这个问题,同时让我的手机插入我的电脑并通过xCode进行测试,这样我就可以安装断点并找到问题的根源。通过xCode进行测试时,此问题始终存在。当我测试它然后,我可以将应用程序推到后台,然后半秒后重新启动它,不仅原始保存请求完成,但它不会导致崩溃。此外,我可以强制退出应用程序,同时通过xCode运行它,它将允许保存完成,然后应用程序将终止。

我确信你可以想象,这非常令人沮丧,因为如果我在使用xCode提供的调试工具时无法重新创建问题,我很难找到错误的来源。为了安全起见,我多次确保在AppDelegate的{​​{1}}或applicationWillEnterForeground方法中没有调用任何内容。我完全迷失了。在我看来,通过在保存applicationDidBecomeActive的过程中将应用程序推回到前台,它会让人感到困惑和崩溃...但是为什么不会发生这种情况当我在使用xCode时在我的设备上测试应用程序?

有人可以帮我这个吗?我可能在几个小时内没有留下任何头发! ; - )

||| 更新06/03 |||

所以在一些评论者的帮助下,我能够发现问题的一部分是由于managedObjectContext请求堵塞了主线程,然后导致应用程序停止响应。我不确定这是我具体问题的确切解决方案,但绝对有助于完全识别问题。转换到后台时我试图完成所有保存的原因之一是因为我在主线程上执行了所有保存,当我在应用程序使用期间执行保存时,会导致延迟或陷入困境主线程。我一直在尝试在后台线程上执行保存执行,并且它帮助极大。这样,我可以在应用程序的其他部分运行时将我的用户数据保存在后台,并且它不会阻塞主线程。这有助于使我在转换到背景时甚至不需要保存,因此崩溃不再发生。

我在mainthread.com上找到了一个名为Justin Driscoll的人为CoreData执行后台线程请求的惊人教程

如果您在后台执行CoreData请求时寻求帮助,请查看此网站:http://themainthread.com/blog/2015/08/core-data-stack-in-swift.html

||| 进一步更新 |||

对于那些可能需要帮助解决类似问题的人。我使用Driscoll先生的教程来创建一个可以保存在后台线程上的CoreData。即使我做了所有事情,它仍然在主线程上执行所有操作,而我却疯了。我找到了一个非常重要的小东西:确保你的保存在主线程之外执行,设置正确的并发类型。例如:

NSManagedObjectContext

一旦我改变了一个小东西,我的保存请求将在后台线程上执行,现在我的主线程可以自由地进行UI更新,什么不是。希望这有助于任何遇到类似挫折的人!

0 个答案:

没有答案