我已经查看了有关在后台执行核心数据保存的问题的答案,但我发现的没有直接解决以下情况:
我已经设置了核心数据,这样当我的应用程序第一次启动时,核心数据将从plist中填充,然后保存到持久存储中(全部在后台线程上)。在此期间,应用程序会显示一个带有动画活动指示符的“请稍候”弹出窗口。这似乎很好地工作,一般来说,即使用户在人口中点击主页按钮,应用程序将完成人口,将应用程序推送到后台。但是,可能应用程序可以在此人口完成之前完全终止(我已成功完成此操作,通过回家,双击回家,并从多任务托盘中删除应用程序< em>真的很快)。在这种情况下,应用程序退出而不将数据保存到商店。在下次启动应用程序时,应用程序会识别该商店已存在,因此它不会填充,从而使用户拥有一个完全空的数据库。所以问题是:
如果人口还没有完成,有没有办法在应用终止时完全删除商店?我试图在-applicationWillTerminate:
执行此操作,但似乎无法正确识别该应用是否处于填充状态。
或者,有没有更好的方法来识别商店何时需要人口?例如,我可以确定商店在发布时是否为空?
答案 0 :(得分:2)
我会建议你解决这个问题的一般方法:
在填充阶段结束时,为您的核心数据库或您的应用默认值(NSUserDefaults)写一个标记;
(现在,当应用程序在完成填充阶段之前终止时,将不会存储该标志);
检查该标志;如果它在那里,你知道人口阶段已经完成,否则你知道出了什么问题。
当然,在人口阶段之后 之前,终止应用程序的可能性很小;除了这个事件之外,在任何情况下,如果发生这种情况,它只会强制您的应用在下次启动时再次填充数据,但不会导致任何数据一致性问题。
更具体的方法是基于beginBackgroundTaskWithExpirationHandler:
您的app委托的
applicationDidEnterBackground:
方法大约需要5秒钟才能完成任务并返回。实际上,这种方法应该尽快返回。如果方法在时间用完之前没有返回,那么您的应用程序将被终止并从内存中清除。如果仍需要更多时间来执行任务,请调用beginBackgroundTaskWithExpirationHandler:
方法来请求后台执行时间,然后在辅助线程中启动任何长时间运行的任务。无论您是否开始任何后台任务,applicationDidEnterBackground:
方法仍必须在5秒内退出。
这将允许您在应用程序在任何“非病态”情况下终止之前获得更多时间来完成人口阶段(即,如果用户像您在测试中那样杀死应用程序,它将无法工作,并且如果应用程序本身出现问题并且在后台线程正在进行填充时崩溃,则不安全。
希望这有帮助。