我有一个调度队列,其中有一些工作。当应用程序进入后台时,我希望队列保持运行,直到时间耗尽或队列耗尽。我如何设置UIBackgroundTaskIdentifier?
我需要像这样把它放到分派块中吗?
dispatch_async(queue, ^{
if (_bgTask == UIBackgroundTaskInvalid) {
if ([UIDevice currentDevice].multitaskingSupported) {
_bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void) {
if (_bgTask != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:_bgTask];
_bgTask = UIBackgroundTaskInvalid;
}
}];
}
}
...
...
if (_bgTask != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:_bgTask];
_bgTask = UIBackgroundTaskInvalid;
}
});
我认为上面发生的事情是它没有注册为长时间运行的任务,直到队列实际运行块。那么,我是否需要将代码的背景部分放在块之外,以便它在实际排队之前执行?
我不知道为什么要在我认为是ivar的情况下跟踪UIBackgroundTaskID
。最简单的方法是:
UIBackgroundTaskIdentifier btid = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{...}];
dispatch_async(queue, ^{
... // Your code...
[[UIApplication sharedApplication] endBackgroundTask:btid];
}
如果你有一个带有工作项的调度队列,并且你进入后台,队列将继续处理它的任务180秒(iOS 7及以上版本)。之后,操作系统会自动暂停所有操作。不再有nsthread, nstimer甚至NSOperationQueues。
所以我不确定你想在你的应用层添加什么额外的代码来实现你想做的事情。