1

我有一个调度队列,其中有一些工作。当应用程序进入后台时,我希望队列继续运行,直到时间用完或队列耗尽。我将如何设置 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;
                }

            });

我认为上面发生的事情是在队列实际运行块之前它没有注册为长时间运行的任务。那么我是否需要将代码的后台部分放在块之外,以便它在实际排队之前执行?

4

2 回答 2

3

我不确定您为什么要跟踪UIBackgroundTaskID我认为是 ivar 的内容。最简单的方法是:

UIBackgroundTaskIdentifier btid = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{...}];
dispatch_async(queue, ^{
    ... // Your code...
    [[UIApplication sharedApplication] endBackgroundTask:btid];
}
于 2011-09-25T08:48:25.323 回答
1

如果您有一个包含工作项的调度队列并且您进入后台,该队列将继续处理其任务 180 秒(iOS 7 及更高版本)。之后,操作系统会自动暂停一切。所以不再有 NSThreads、NSTimers 甚至 NSOperationQueues。一切都暂停了。

因此,我不确定您尝试在应用程序层中添加哪些额外代码来实现您想要做的事情。它是预先构建的。

于 2014-07-18T22:46:29.727 回答