为了账号安全,请及时绑定邮箱和手机立即绑定

当应用程序在后台运行时预定NSTimer?

当应用程序在后台运行时预定NSTimer?

iOS
凤凰求蛊 2019-11-12 10:27:03
当应用程序在后台运行时,人们如何处理预定的NSTimer?假设我每小时更新一次我的应用程序中的内容。updateTimer = [NSTimer scheduledTimerWithTimeInterval:60.0*60.0 target:self selector:@selector(updateStuff) userInfo:nil repeats:YES];在后台时,此计时器显然不会触发(?)。当用户回到应用程序时该怎么办?计时器是否仍在运行同一时间?如果用户在一个小时后回来,将会发生什么。它会在错过的所有时间触发还是会等到下一个更新时间?我希望它执行的操作是在应用程序启动后立即更新,如果它应该触发的日期是过去的话。那可能吗?
查看完整描述

3 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

您不应该通过设置计时器来解决此问题,因为不允许您在后台执行任何代码。想象一下,如果用户在此期间或在其他一些极端情况下重新启动iPhone,将会发生什么情况。


使用AppDelegate 的applicationDidEnterBackground:和applicationWillEnterForeground:方法来获取所需的行为。它更加健壮,因为当您的应用由于重启或内存不足而被完全杀死时,它也将起作用。


您可以节省当应用程序进入后台时计时器将在下一次触发的时间,并检查当应用程序返回到前台时是否应采取措施。也可以使用这种方法停止并启动计时器。当您的应用运行时,您可以使用计时器在适当的时候触发更新。


查看完整回答
反对 回复 2019-11-12
?
当年话下

TA贡献1890条经验 获得超9个赞

如果您或其他人正在寻找如何在Swift的后台运行NSTimer的方法,请将以下内容添加到您的App Delegate中:


var backgroundUpdateTask: UIBackgroundTaskIdentifier = 0



func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    return true

}


func applicationWillResignActive(application: UIApplication) {

    self.backgroundUpdateTask = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({

        self.endBackgroundUpdateTask()

    })

}


func endBackgroundUpdateTask() {

    UIApplication.sharedApplication().endBackgroundTask(self.backgroundUpdateTask)

    self.backgroundUpdateTask = UIBackgroundTaskInvalid

}


func applicationWillEnterForeground(application: UIApplication) {

    self.endBackgroundUpdateTask()

}

干杯!


查看完整回答
反对 回复 2019-11-12
  • 3 回答
  • 0 关注
  • 383 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信