【问题标题】:NSTimer doesn't work in background on deviceNSTimer 在设备的后台不起作用
【发布时间】:2023-03-04 02:51:01
【问题描述】:

我正在尝试在后台运行一些 nstimer,实际上我使用此代码在模拟器上实现了它

- (void)start {

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

        if ([[UIDevice currentDevice] isMultitaskingSupported]) {
            UIApplication *application = [UIApplication sharedApplication];

            __block UIBackgroundTaskIdentifier background_task;

            background_task = [application beginBackgroundTaskWithExpirationHandler: ^{
                [application endBackgroundTask:background_task];
                background_task = UIBackgroundTaskInvalid;

            }];

            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

                [application endBackgroundTask: background_task];
                background_task = UIBackgroundTaskInvalid;

                if (self.timer == nil) self.timer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(countdown) userInfo:nil repeats:YES];
                [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];
                [[NSRunLoop currentRunLoop] run];
            });
        }
    }

}

问题是在真机上它不起作用,也许我应该启用一些后台模式?

【问题讨论】:

标签: xcode nstimer background-process


【解决方案1】:

几个问题:

  1. NSTimer 需要一个运行循环,不能从后台全局工作线程调度(除非你在 mainRunLoop 上调度它,或者在某个后台线程上手动创建一个运行循环)。

    如果您需要countdown 方法在后台线程中运行,您可以使用调度计时器。或者,更简单,只需在主运行循环中安排计时器。

  2. 您正在创建后台任务,但在创建倒计时重复计时器时立即终止它。在有限长度的任务完成之前,您可能不想终止后台任务。

    注意,如果您通过 Xcode 中的调试器运行应用程序,这可能会影响后台任务的行为、应用程序终止等(链接到调试器的过程使应用程序保持活动状态)。确保在设备上测试应用程序,而不是通过按 Xcode 中的“开始”按钮,而是确保应用程序已终止,然后手动点击设备“主”屏幕上的应用程序图标。

  3. 你的倒计时有多长?这种后台任务机制是为有限长度的任务设计的(例如,我认为它目前给你 3 分钟左右)。

  4. 如果您的后台计时器的持续时间可能更长,您可能只想安排一个local notification 让用户知道指定的计时器间隔何时过去。

    请注意,无论如何,这可能是在后台运行“计时器”的更明智的模型。与其让应用在后台运行(占用 CPU 周期和电池),不如指定何时将本地通知发送给用户并完全绕过后台任务模式。

【讨论】:

  • 感谢您的回答和解释,我实际上在编译时不知道倒计时有多少时间,因为我需要用户来决定它。所以这似乎不是我的问题的正确方法,你建议如何管理一些也应该在后台工作的倒计时?我还要添加通知
  • 请参阅第 4 点(我必须在您输入评论时输入),其中我建议了一种替代机制,即本地通知。适用于未来任意时间点,效率远高于后台任务模式。
猜你喜欢
  • 2017-02-22
  • 2019-05-10
  • 1970-01-01
  • 2020-01-09
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多