【发布时间】:2015-04-28 12:29:49
【问题描述】:
即使应用程序进入后台,我也想运行一些长时间运行的进程。我正在调用应用程序的beginBackgroundTaskWithExpirationHandler: 方法,在expirationBlock 中我正在调用应用程序的endBackgroundTask。
这是实现:
__block UIBackgroundTaskIdentifier task = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask:task];
task = UIBackgroundTaskInvalid;
}];
dispatch_queue_t queue = dispatch_queue_create("com.test.test1234", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
// My Task goes here
});
在某些情况下,我的串行队列有更多任务要执行,这些任务无法在系统提供的时间内完成。所以到期块将执行,并且我正在结束 UIBackgroundTaskIdentifier 但没有停止调度过程(我什至不能取消调度)。
苹果的文件说:
对 beginBackgroundTaskWithName:expirationHandler: 或 beginBackgroundTaskWithExpirationHandler: 方法的每次调用都会生成一个唯一的令牌以与相应的任务相关联。当你的应用完成一个任务时,它必须调用 endBackgroundTask: 方法并带有相应的令牌,让系统知道该任务已经完成。未能为后台任务调用 endBackgroundTask: 方法将导致您的应用程序终止。如果您在启动任务时提供了过期处理程序,系统会调用该处理程序并给您最后一次机会来结束任务并避免终止。
因此,如果我不调用endBackgroundTask:,我的应用程序将被终止,这没关系。
我的问题是:在我当前的实现中,如果我在 expirationHandler 块中调用 endBackgroundTask: 并且我的调度队列的任务没有完成怎么办?我的应用将被终止或暂停?
谢谢
【问题讨论】:
-
如果您在队列的任何位置调用 endBackgroundTask:。它只是暂停了您的应用程序,使应用程序进入睡眠状态。
-
@chiragshah 所以这不能成为看门狗杀死我的应用程序的原因吗?只有当我错过
endBackgroundTask时,看门狗才会终止应用程序,对吗? -
是的,我也认为在我的应用程序中它可以正常工作
标签: ios long-running-processes uibackgroundtask backgrounding