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

los*_*its 1 grand-central-dispatch ios swift

我已经阅读了这个答案,我不相信它有我想要的东西,但我是初学者,我很高兴有人在这个链接中指出答案:dispatch_after - 迅捷的GCD?

我的目标:设置一个功能,每天在用户的时区(或系统的时区)上午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))
    });
Run Code Online (Sandbox Code Playgroud)

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

此外,任何关于总体目标的建议,每天同一时间安排起火功能都将非常感激.

我也没有结婚使用GCD这个目标,但它是我遇到最多的搜索.

Rob*_*Rob 5

简而言之,除非应用程序仍在运行,否则通常无法在任意时间执行某些任意功能.在dispatch_after该应用程序仍然是在计划的时间,这通常不保证运行的假定.这dispatch_after对于"在x秒内做某事"非常有用,而不是"明天早上9点做某事".

是的,dispatch_after可以在某些后台线程上执行某些任务,但这与使应用程序在后台运行(即,当应用程序本身不再处于前台时)的概念截然不同.请参阅iOS应用程序编程指南:后台执行,它列举了所有各种后台机制.

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

  • 使用后台提取,您可以机会性地检查服务器上的新数据(但不是根据您的日程安排,而是由操作系统决定).

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

  • 您可以安排在特定时间触发本地通知(尽管用户有责任查看通知并点击该通知以便应用程序运行).有关更多信息,请参阅" 本地和远程通知编程指南".

  • 您可以注册推送通知,然后您的服务器可以在您选择的某个时间向客户端发送通知(但这需要服务器端开发).

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

如果您可以在预定时间阐明您希望应用程序执行的操作,我们可能会建议可能的内容和替代方案.但是,在广泛的笔触中,这些是您拥有的基本选项.