即使应用程序在后台运行,我也想运行一些长时间运行的进程。我正在调用应用程序的beginBackgroundTaskWithExpirationHandler:
方法,并且在 expireBlock 中我正在调用应用程序的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:
我的应用程序将被终止,这没关系。
我的问题是:在我当前的实现中,如果我endBackgroundTask:
在 expireHandler 块中调用并且我的调度队列的任务没有完成怎么办?我的应用程序将被终止或将被暂停?
谢谢