2017-08-13 9 views
0

私はSwiftで単純なアプリケーションを開発しており、24時間ごとに関数の実行をスケジュールする必要があります。私はこの方法を知ってる:swiftでの関数実行の実行

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

私の問題を解決することができますが、これは24時間の遅延のための適切なソリューションですか? ありがとう

+0

iOSでは、常にフォアグラウンドで実行されているAppの場合のみ可能です。 macOSでは、cronjobやバックグラウンドサービスをよく使うべきです。この機能で何を達成したいのですか? – clemens

+0

ステータスバー上で動作するmacosアプリケーションです。私はいくつかの醸造公式が更新される必要があるかどうかをチェックする機能を望みます。 – Marco

答えて

0

理論的にはこれが可能です。 問題は、アプリケーションがフォアグラウンドで24時間稼働しなければならないことです。これは起こりそうにないでしょう。残念ながら、そのようなバックグラウンドタスクは実行できません。

ソリューション:

ジャスト機能はバックグラウンドで実行するのと同じように見えます。 update関数が呼び出されるたびに、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() 
    } 

} 

は、あなたはそれがで更新されたように見せかけることができる方法背景。私はこれを私のアプリでずっと使っていて、完璧に動作します。

EDIT:多分、念のアプリは実際の行に24時間を実行しない

、私はあなたにも最初の投稿の上部の機能を設定します。

+0

あなたの答えをお寄せいただきありがとうございます。おそらく私のアプリが今どのように機能しているかを説明しなければならなかったでしょう。つまり、アプリケーションが起動されるたびにupdate関数が呼び出されます。私の問題は、24時間後にユーザーがMacをオフにしないと仮定すると、アプリが最後にチェックした24時間後にアップデートがスケジュールされたかったということです。だから、後の派遣は適切に機能すると思いますか?編集:アプリケーションはステータスバーに表示されたままで、DropboxやGoogleドライブのアプリと同じです。 – Marco

+0

はい、間違いなく動作します。幸運:) @MarcoMaggipinto –

+0

ありがとう!あなたにも幸運を祈る! – Marco