使用Grand Central Dispatch每天同一时间安排一项function

我已经阅读了这个答案,我不相信它有我在找什么,但我是一个初学者,我很高兴有人指出在这个链接的答案: dispatch_after – GCD在swift?

我的目标是:设置一个function,在用户的时区(或系统的时区)每天上午9点运行。

我已经非常简短地使用GCD来延迟一个函数,如下所示(它工作的很好):

var dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(10 * Double(NSEC_PER_SEC))) dispatch_after(dispatchTime, dispatch_get_main_queue(), { let alert = UIAlertView() alert.title = "Foo Alert" alert.message = "foo." alert.addButtonWithTitle("OK") alert.show() AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate)) }); 

所以我想每天都按照上面提到的那样开火,但是我坚持的第一件事就是将DISPATCH_TIME_NOW换成时区相关值。 我是否甚至需要考虑时区,或者只是用军事09:00取代DISPATCH_TIME_NOW就足够了?

另外,关于总体目标的任何build议,每天同一时间调度发射function都将非常感激。

我也没有结婚使用GCD这个目标,但这是我遇到最多的search。

总之,除非应用程序仍在运行,否则通常不能在某个任意时间执行一些任意函数。 dispatch_after假定应用程序仍然在预定的时间运行,这是不能保证的。 dispatch_after是“在x秒内做某事”的好方法,而不是“明天早上9点做某事”。

是的, dispatch_after可以在一些后台线程上执行一些任务,但这与应用程序在后台运行(即,应用程序本身不再处于前台)的概念非常不同。 请参阅iOS应用程序编程指南:后台执行 ,其中列举了所有各种后台机制。

当应用程序当前不活动时执行某些操作的关键技术包括:

  • 使用后台获取,您可以机会性地检查服务器上的新数据(但不是按照您的计划,而是由操作系统决定)。

  • 如果您的应用程序正在服务几个非常具体的任务(如音乐应用程序,VOIP,导航应用程序等),您可以注册后台操作。

  • 您可以安排本地通知在特定时间触发(尽pipe用户有义务查看通知并点击该通知以便应用程序运行)。 欲了解更多信息,请参阅本地和远程通知编程指南 。

  • 您可以注册推送通知,然后您的服务器可以在您select的某个时间将通知推送给客户端(但需要进行服务器端开发)。

还有其他的后台任务可以configuration(例如,在后台继续networking请求,即使应用程序不再处于活动状态等等,请求几分钟完成一些有限长度的任务),但这些与您的问题似乎无关。

如果您可以在预定时间澄清您希望应用程序执行的操作,我们可能会build议可能的操作以及替代方法。 但是,在广泛的笔触,这些是你有基本的select。

重要的是,你应该使用dispatch_walltime而不是dispatch_time。 区别在于:如果您将dispatch_time设置为“从现在开始1000秒”,则将从现在起运行1000秒(如果您的应用程序正在运行)。 但dispatch_walltime将计算用户时钟的哪个时间,并在用户时钟到达时运行。

所以,如果你明天早上9点设置dispatch_time,并且将设备的时钟向前设置了5分钟,那么dispatch_time将会在我的时钟显示上午9:05时运行。 dispatch_walltime将在上午9:00运行。 (如果我将时钟从上午8:55更改为上午9:05,则必须试验一下,因为时钟显示上午9:00显然不可能)。