【问题标题】:beginBackgroundTaskWithExpirationHandlerbeginBackgroundTaskWithExpirationHandler
【发布时间】:2010-10-06 09:32:45
【问题描述】:

我正在制作一个音频将在后台播放的应用程序。在以下代码中,未声明 bgTask。 bgTask 应该是一个什么样的对象?

- (void)applicationDidEnterBackground:(UIApplication *)application 
{
    UIApplication  *app = [UIApplication sharedApplication];
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
        [app endBackgroundTask:bgTask]; 
        bgTask = UIBackgroundTaskInvalid;
    }];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{});

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

【问题讨论】:

  • 请以正确的方式格式化您的代码。

标签: iphone cocoa-touch


【解决方案1】:

您需要在分配之前声明 bgTask:

UIBackgroundTaskIdentifier bgTask = 0;

【讨论】:

  • 谢谢。每次我读到这些由 Apple 编写的模糊文档(大约 90% 的文档)时,我都想打自己一顿。他们应该雇用知道如何编写文档的人。
  • 你想打自己..?
  • @willcodejavaforfood 我已经用计时器尝试过这段代码,但计时器在 10 分钟后停止,我该如何长时间继续它
  • 澄清一下,应该是UIBackgroundTaskIdentifier bgTask = 0;,因为它是NSUInteger
【解决方案2】:

我无法评论以前的答案,但是要初始化 UIBackgroundTaskIdentifier,您不应将其设置为 nil 或 0。您应该将其设置为:

UIBackgroundTaskInvalid

documentation UIBackgroundTaskInvalid 中说它应该用于初始化变量或检查错误。

【讨论】:

  • UIBackgroundTaskInvalid = 0x0000000000000000。同样的事情。
  • @duci9y 相信我,您不希望代码中出现幻数。坚持使用 API 提供的常量。
【解决方案3】:

您正在块中使用 bgTask,因此您必须像这样声明它..

__block UIBackgroundTaskIdentifier bgTask = 0;

__block 将允许此变量在块方法中使用。它有双下划线。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多