【问题标题】:Handling app termination during core data background population在核心数据后台填充期间处理应用程序终止
【发布时间】:2012-05-02 15:55:18
【问题描述】:

我查看了有关在后台执行核心数据保存的问题的答案,但我发现没有一个直接解决了以下情况:

我已经设置了核心数据,这样当我的应用首次启动时,核心数据会从 plist 中填充,然后保存到持久存储中(全部在后台线程上)。在此期间,应用程序会显示一个带有动画活动指示器的“请稍候”弹出窗口。这似乎工作得很好,并且通常即使用户在填充过程中点击主页按钮,应用程序也会完成填充,将应用程序推到后台。但是,可能应用程序可能会在此填充完成之前完全终止(我已经通过点击 home、双击 home 并从多任务托盘中删除应用程序成功地做到了这一点真的很快)。在这种情况下,应用程序退出而不将数据保存到商店。在应用程序的下一次启动时,应用程序识别出该商店已经存在,因此它不会填充,从而为用户留下一个完全空的数据库。所以问题是:

  • 如果人口尚未完成,是否有办法在应用程序终止时完全删除商店?我尝试在 -applicationWillTerminate: 中执行此操作,但它似乎无法正确识别应用程序是否正在填充。

  • 或者,有没有更好的方法来识别商店何时需要人口?例如,我可以在启动时确定商店是否是空的吗?

【问题讨论】:

    标签: iphone objective-c ios ipad core-data


    【解决方案1】:

    我建议用这种通用方法解决您的问题:

    1. 在填充阶段结束时,将标志写入您的核心数据库或应用默认值 (NSUserDefaults);

    2. (现在,当应用程序在完成填充阶段之前终止时,将不会存储标志);

    3. 在启动时,检查那个标志;如果它在那里,你就知道填充阶段已经完成,否则你就知道出了问题。

    当然,在填充阶段完成标志存储之前结束应用程序的可能性很小;除了这个事件不太可能发生之外,无论如何,如果发生这种情况,它只会迫使您的应用在下次启动时再次填充数据,但不会导致任何数据一致性问题。

    更具体的方法是使用beginBackgroundTaskWithExpirationHandler:

    您的应用委托的 applicationDidEnterBackground: 方法大约有 5 秒的时间来完成所有任务并返回。在实践中,此方法应尽快返回。如果该方法在时间用完之前没有返回,您的应用程序将被终止并从内存中清除。如果您仍然需要更多时间来执行任务,请调用beginBackgroundTaskWithExpirationHandler: 方法请求后台执行时间,然后在辅助线程中启动任何长时间运行的任务。无论您是否启动任何后台任务,applicationDidEnterBackground: 方法仍必须在 5 秒内退出。

    这将使您有更多时间在应用程序因任何“非病态”情况而终止之前完成填充阶段(即,如果用户像您在测试中所做的那样杀死应用程序,它将不起作用,并且如果应用程序本身出现问题并且在后台线程执行填充时崩溃,将不安全。

    希望这会有所帮助。

    【讨论】:

    • 是的!我知道有一些简单优雅的方法可以做到这一点。 NSUserDefaults 工作就像一个魅力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    相关资源
    最近更新 更多