2017-08-13 123 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