【问题标题】:Running a finite-length background task运行有限长度的后台任务
【发布时间】:2012-12-14 08:34:59
【问题描述】:


当应用程序进入后台状态时,我正在做一些处理,我把它放在 beginBackgroundTaskWithExpirationHandler() 下,因此应该分配十分钟。但是,我相信该应用程序在此之前已被暂停。我正在执行的任务是内存和 CPU 密集型的,那么操作系统是否有可能将我的应用程序置于挂起状态?
如果是这样,有没有办法绕过这些限制。 (我愿意使用私有 API)。

下面是启动后台任务的代码:

   if([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]){

        if([[UIDevice currentDevice] isMultitaskingSupported]){
            __block UIBackgroundTaskIdentifier bgTask;
            UIApplication *application = [UIApplication sharedApplication];
            bgTask = [application beginBackgroundTaskWithExpirationHandler:^{

                    [application endBackgroundTask:bgTask];
                    bgTask = UIBackgroundTaskInvalid;
            }];

            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                [self captureImage];
                [application endBackgroundTask:bgTask];
                bgTask = UIBackgroundTaskInvalid;
            });
        }
    }

【问题讨论】:

  • 你能显示你用来启动后台任务的代码吗?
  • 这到底是怎么回事不是一个真正的问题

标签: ios ios5 ios4 ios6


【解决方案1】:

我不确定 Daij-Dan 是否完全正确。

这部分我同意他的观点:

the os may kill you at any time when its pressured.

然而,“压力”这个词是相当模糊的。而且我相信应该有很大的压力(例如内存不足)来暂停合法地请求更多时间的应用程序。一方面,这是一个真实的场景案例。另一方面,这种情况并不经常发生(iOS 设备现在有相当多的内存)。

来自文档(http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html):

对该方法的每次调用都必须通过对 endBackgroundTask 的匹配调用来平衡: 方法。运行后台任务的应用程序有有限的时间来运行它们。 (您可以使用 backgroundTimeRemaining 属性找出可用的时间。)如果您没有在时间到期之前为每个任务调用 endBackgroundTask:,系统会终止应用程序。如果您在 handler 参数中提供了一个块对象,系统会在时间到期之前调用您的处理程序,让您有机会结束任务。

我会推荐:

  • 在完成处理程序中添加一些日志
  • 用逻辑(包括backgroundTimeremaining)将日志添加到日志中

如果您的应用被暂停,请查看系统控制台日志。

附:我删除了 iphone-privateapi 标签,因为它是公共 API。

【讨论】:

  • 谢谢。我使用了 backgroundTimeRemaining 属性并监控了剩余时间,却发现突然下降到 0。
  • 这很有趣。你有没有在系统控制台中看到任何可疑的东西(我从未见过这样的案例)。
【解决方案2】:

当操作系统受到压力时,它可能会随时杀死你。十分钟左右没有保证。 (如果你表现得好,你也可以跑更长的时间:D)

无法强制 ios 运行您的应用 AFAIK

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 2014-10-26
    • 2018-01-12
    • 1970-01-01
    相关资源
    最近更新 更多