2017-08-13 124 views
0

我正在Swift中开发一个简单的应用程序,我需要每24小时安排一次函数执行。我知道的方法:在swift中执行函数执行

DispatchQueue.main.asyncAfter(deadline: .now() + 10.0, execute: { 
    self.functionToCall() 
}) 

,可以解决我的问题,但是,这是一个24小时延误正确的解决方案? 谢谢

+0

在iOS中,这仅适用于在前台不断运行的应用程序。在macOS上,您最好使用cronjob或后台服务。这个功能想达到什么目的? – clemens

+0

它是一个在状态栏上运行的macos应用程序。我希望该功能检查是否需要更新一些冲泡配方。 – Marco

回答

0

理论上,这是可能的。 问题是,你的应用程序将不得不在前台运行24小时,这是不太可能发生的。不幸的是,你不能像这样运行后台任务。

解决办法:

只是使它看起来像函数将在后台执行。每次调用更新函数时,只需将Int(Date().timeIntervalSince1970)保存为UserDefaults即可。这就像一个时间戳,并保存你最后一次调用你的更新函数。在viewDidLoad中()每一次 - 功能(不知道这是否就是所谓的在Mac应用程序是相同的,但你能想象我的意思)电话:

If let timestamp = UserDefaults.standard.integer(forKey: "yourTimestampKey") { 

    let currentTimestamp = Date().timeIntervalSince1970 
    if (currentTimestamp - timestamp) > 86400 { // number of seconds in 24 hours 
     // the last time your function was updated was at least 24h ago 

     update() 
    } 

} 

那怎么可以使它看起来就像是在更新的背景。我一直在我的应用程序中使用它,它完美地工作。

编辑:

也许,公正的情况下应用确实连续24小时运行,我会成立,你先贴以及上层函数。

+0

感谢您的回答,可能我不得不更好地解释我的应用程序是如何工作的:每次启动应用程序时都会调用更新函数,因此,我不介意每24小时调用一次该函数。我的问题是,假设用户在24小时内没有关闭Mac,我希望在应用程序最后一次检查后24小时安排更新。那么,你认为之后的派遣会正常工作吗?编辑:该应用程序在状态栏中保持活动,就像保管箱或谷歌驱动器应用程序。 – Marco

+0

是的,它肯定会工作。祝你好运:) @MarcoMaggipinto –

+0

谢谢!祝你好运! – Marco