以模态方式显示的ViewController
有一个保存按钮,用于将数据保存在数据库中,然后unwind
ViewController
。
我还在notification
发布applicationDidEnterBackground
来呼叫save method
,以便当用户没有点击保存按钮并点击iPhone home button
用户数据gat时保存
就像Apple Doc建议
一样- (void)applicationDidEnterBackground:(UIApplication *)application
{
bgTask = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^{
// Clean up any unfinished task business by marking where you
// stopped or ending the task outright.
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
// Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Do the work associated with the task, preferably in chunks.
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
});
}
问题1:
我的任务不是很长,在DB
中保存几百行需要几秒钟,是否仍然需要放入dispatch_async
?
问题2:
用户可以点击保存按钮并立即点击iPhone主页按钮,在这种情况下,我的保存方法将被调用两次,这对我的应用程序有害,我应该使用dispatch_once
还是有其他方式?
问题3 Apple Doc说:
无法为后台任务调用endBackgroundTask:方法 将导致您的应用终止。如果你提供了 启动任务时到期处理程序,系统调用它 处理程序,并给你最后一次机会结束任务,避免 终止。
endBackgroundTask:
,那么iOS会使该应用程序崩溃吗?avoid termination
是什么意思,如果我的应用程序处于后台并且我的任务也已完成,那么iOS会保持我的应用程序存活并阻止其终止吗? 问题4
我的应用在使用此backgroudtask
后进入后台后保持功能的时间有多长?因为Apple在评论中提到// Start the long-running task and return immediately.
答案 0 :(得分:2)
问题1
如果您的操作时间少于5秒(根据Documentation),则可以在没有beginBackgroundTaskWithName
和dispatch_async
的情况下执行此操作,但您必须考虑该数据是否会增加随着时间的推移,如果情况确实如此,那么最好使用beginBackgroundTaskWithName
和dispatch_async
进行此操作。
问题2
我会做的是在NSUserDefaults
中存储一个关于保存操作的标志,因此如果保存操作仍在进行中,您可以避免再次尝试保存它。
问题3
1.-如上所述,您的应用程序将被终止并从内存中清除,因为当您不再需要它时,您仍然可以保留资源。
2.-通常,当用户离开您的应用时,您的应用仍然可以不时在后台运行某些操作,或者如果您启用了该模式,则会响应推送通知。但是,如果您的应用程序被用户或操作系统终止,那么您将无法
问题4
遗憾的是,文档中没有关于它的说明,但如果您使用beginBackgroundTaskWithName
,则可以放心使用它超过5秒。
希望这能消除任何疑虑。
干杯
-----编辑1 -----
如@ Paulw11所述,对于问题4 ,“它目前是3分钟,您可以检查UIApplication属性backgroundTimeRemaining以确定剩余时间。”