【问题标题】:Application Will Terminate Notification & Saving Drafts (Core Data)应用程序将终止通知和保存草稿(核心数据)
【发布时间】:2009-11-16 20:05:02
【问题描述】:

如果用户当前在我的编辑视图控制器中,我希望能够在用户关闭我的应用程序时保存更改。为此,我正在观察共享应用程序的UIApplicationWillTerminateNotification。在我的应用委托中,我使用 applicationWillTerminate: 方法关闭并释放所有核心数据上下文。

我发现的问题是应用程序委托中的applicationWillTerminate: 方法在任何观察者对UIApplicationWillTerminateNotification 通知做出反应之前被调用。这意味着在我的编辑视图控制器有机会保存任何内容之前,我的核心数据堆栈已被释放并关闭!

这通常是如何克服的,因为我看不到路!

非常感谢,

迈克尔

【问题讨论】:

    标签: iphone core-data


    【解决方案1】:

    编辑: 由于运行循环和通知的内部工作原理,第一种(基于通知的)方法可能行不通。

    如果您想坚持使用基于通知的架构,您实际上可以在applicationWillTerminate: 中发布您自己的通知。只需创建您自己的MyApplicationWillTerminate 通知,然后在[NSNotificationCenter defaultCenter] 上致电postNotification:。然后让您的编辑控制器注册MyApplicationWillTerminate 的实例,而不是默认的UIApplicationWillTerminateNotification

    另一个选择是让您的应用程序委托存储您的编辑控制器的实例(如果它是可见的),然后在 applicationWillTerminate: 中保存新信息,然后再释放 Core Data 上下文。但是,这会用额外的实例变量污染您的应用委托,因此它可能不是最佳解决方案。

    最后一个想法:为什么不让应用保存用户所做的任何编辑?这样,您不必担心应用程序在编辑信息的过程中关闭 - 编辑已经保存,您可以简单地释放 Core Data 内容。 (这可能不适合您;如果不了解您的应用程序结构以及您正在编辑的数据,我真的不能说。)

    【讨论】:

    • +1 用于在用户进行编辑时保存草稿;在终止期间做任何有用或复杂的事情的时间非常有限。
    • 在编辑发生时保存编辑的有趣之处。我可能会调查一下。当您提到发布我自己的通知时,它们不会在下一个运行循环和applicationWillTerminate: 代码完成后被拾取吗?因为所有代码都在同一个(主)线程上。
    • Michael:你可能是对的 - 我在发布答案(现已编辑)后就意识到了这一点。您可能最好在编辑发生时保存它们,从而完全避开这个问题。
    • 我刚刚有了一个想法!我注意到编辑视图控制器的viewWillDisappear: 方法在applicationWillTerminate: 之前被调用。这样我就可以保存我的草稿了!这不是一个非常复杂的保存,只是一个带有几位数据的 plist,所以我认为在终止时执行保存会很好。有什么想法或可能的缺点吗?
    • 您可以,但请记住,一旦用户按下主页按钮,Springboard 会给您的应用程序提供一小段时间(大约四到五秒)自行关闭,否则它将为您终止应用程序。这看起来像一个冻结的应用程序和用户崩溃,这不是一件好事。此外,即使您只花一两秒钟,由于按钮按下和主屏幕之间的延迟,您也会给人一种设备速度变慢的印象。因此,当您可以做到这一点时,是的,问问自己:应该您做到这一点,并且可以足够快地完成吗?
    【解决方案2】:

    这里不确定,但是 NSManagedObjectContext 是否保留其存储协调器和对象模型?在这种情况下,让您的控制器保留托管对象上下文是否就足够了?

    【讨论】:

      猜你喜欢
      • 2021-09-28
      • 1970-01-01
      • 2018-08-08
      • 1970-01-01
      • 2020-05-02
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      相关资源
      最近更新 更多