如何在Swift中按特定时间运行代码

6

我已经寻找了很多地方,但是我找不到这个问题的答案。 我想要一个特定的函数在每天早上6点和晚上6点运行一次,用于我的应用程序的日/夜模式。 这不需要在后台运行,只需要当应用程序打开时运行,但同时我还想要执行应用程序的其他功能,同时检查时间。


这可能会有所帮助:https://www.hackingwithswift.com/example-code/system/how-to-run-code-at-a-specific-time - Amber K
当应用程序完成启动时触发此事件,并在您的AppDelegate中指定选择器。每当在前台尝试通过触发通知来运行它。 - Amber K
1
所以,如果没有后台操作并且用户在早上6:05启动应用程序,我可以假设您希望在用户在早上6:05启动应用程序时立即执行它在早上6:00应该完成的操作吗? - Rob
假设是这种情况,如果他们在某一天晚上11点启动应用程序,然后在第二天下午5:58再次启动它,此时它会执行它在早上6点要执行的操作。但是你想在2分钟后再次执行吗?简而言之,这是否真的像早上6点和晚上6点那样简单,还是“如果超过12小时则执行”或两者的组合? - Rob
1个回答

19
你可以这样做。只需使用Calendar对象设置一个Date。将您的特定时间以军事小时制(从00:00到23:59,其中00:00表示午夜)放入其中,如果您的应用程序在前台并且指定的时间到达,则会执行您使用的函数作为选择器。
试试吧,祝编码愉快!
override func viewDidLoad() {
    super.viewDidLoad()
    
    let calendar = Calendar.current 

    let now = Date()
    let date = calendar.date(
        bySettingHour: 23,
        minute: 52,
        second: 0,
        of: now)!
    
    let timer = Timer(fireAt: date, interval: 0, target: self, selector: #selector(runCode), userInfo: nil, repeats: false)
    
    RunLoop.main.add(timer, forMode: RunLoop.Mode.common)
}

func runCode() {
    print("Do whatever here")
}

谢谢您的回答。您知道这是否会影响设备的电池寿命吗? - user12766300
说实话,我不知道对电池寿命的影响。 - Pato Salazar
没问题,如果有人找到了更高效的方法,我们也可以更新这个答案。 - Pato Salazar
当应用程序被挂起时,这段代码是否会执行? - Shourob Datta
如果您想要优化功耗和响应性,创建计时器时请使用容差参数。来源-https://developer.apple.com/documentation/foundation/timer/1415085-tolerance - Ram Patra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接