在 swift 中安排函数执行
Schedule function execution in swift
我正在 Swift 开发一个简单的应用程序,我需要安排每 24 小时执行一次函数。我知道这个方法:
DispatchQueue.main.asyncAfter(deadline: .now() + 10.0, execute: {
self.functionToCall()
})
这可以解决我的问题,但是,这是延迟 24 小时的正确解决方案吗?
谢谢
理论上,这是可能的。
问题是您的应用程序必须 运行 在前台运行 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 小时,我也会设置您首先发布的上层功能。
我正在 Swift 开发一个简单的应用程序,我需要安排每 24 小时执行一次函数。我知道这个方法:
DispatchQueue.main.asyncAfter(deadline: .now() + 10.0, execute: {
self.functionToCall()
})
这可以解决我的问题,但是,这是延迟 24 小时的正确解决方案吗? 谢谢
理论上,这是可能的。 问题是您的应用程序必须 运行 在前台运行 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 小时,我也会设置您首先发布的上层功能。