毎分関数を実行するにはどうすればよいですか?JavaScriptではのようなことができますsetInterval
が、Swiftにも同様のものが存在しますか?
必要な出力:
Hello World、1分に1回...
毎分関数を実行するにはどうすればよいですか?JavaScriptではのようなことができますsetInterval
が、Swiftにも同様のものが存在しますか?
必要な出力:
Hello World、1分に1回...
回答:
var helloWorldTimer = NSTimer.scheduledTimerWithTimeInterval(60.0, target: self, selector: Selector("sayHello"), userInfo: nil, repeats: true)
func sayHello()
{
NSLog("hello World")
}
Foundationをインポートすることを忘れないでください。
スウィフト4:
var helloWorldTimer = Timer.scheduledTimer(timeInterval: 60.0, target: self, selector: #selector(ViewController.sayHello), userInfo: nil, repeats: true)
@objc func sayHello()
{
NSLog("hello World")
}
NSTimer
ターゲットを保持することを忘れないでください。したがって、この設定でhelloWorldTimer
は、プロパティself
がself
保持helloWorldTimer
とhelloWorldTimer
保持の保持サイクルになりますself
。
iOSバージョン10以上を対象とする場合は、ブロックベースのレンディションのを使用できますTimer
。これにより、強力な参照サイクルの可能性が簡素化されます。例:
weak var timer: Timer?
func startTimer() {
timer?.invalidate() // just in case you had existing `Timer`, `invalidate` it before we lose our reference to it
timer = Timer.scheduledTimer(withTimeInterval: 60.0, repeats: true) { [weak self] _ in
// do something here
}
}
func stopTimer() {
timer?.invalidate()
}
// if appropriate, make sure to stop your timer in `deinit`
deinit {
stopTimer()
}
一方でTimer
、一般的に最善である、完全を期すために、私は、バックグラウンドスレッドでタイマーをスケジュールするために有用である、あなたはまた、ディスパッチタイマーを使用することができることに注意してください。ディスパッチタイマーを使用すると、ブロックベースであるため、参照を使用している限り、の古いtarget
/ selector
パターンによる強力な参照サイクルの課題のいくつかを回避Timer
できweak
ます。
そう:
var timer: DispatchSourceTimer?
func startTimer() {
let queue = DispatchQueue(label: "com.domain.app.timer") // you can also use `DispatchQueue.main`, if you want
timer = DispatchSource.makeTimerSource(queue: queue)
timer!.schedule(deadline: .now(), repeating: .seconds(60))
timer!.setEventHandler { [weak self] in
// do whatever you want here
}
timer!.resume()
}
func stopTimer() {
timer?.cancel()
timer = nil
}
deinit {
self.stopTimer()
}
詳細については、タイマーの作成のセクション派遣ソース例で派遣元のセクション並行処理プログラミングガイド。
Swift 2については、この回答の以前のリビジョンを参照してください。
dispatch_after
。または繰り返さないNSTimer
。
ある程度の時間のずれを許容できる場合は、毎分いくつかのコードを実行する簡単なソリューションを次に示します。
private func executeRepeatedly() {
// put your code here
DispatchQueue.main.asyncAfter(deadline: .now() + 60.0) { [weak self] in
self?.executeRepeatedly()
}
}
executeRepeatedly()
一度実行するだけで、毎分実行されます。所有オブジェクト(self
)が解放されると、実行が停止します。フラグを使用して、実行を停止する必要があることを示すこともできます。
使用できますTimer
(swift 3)
var timer = Timer.scheduledTimerWithTimeInterval(60, target: self, selector: Selector("function"), userInfo: nil, repeats: true)
selector()に関数名を入れます
Timer
...のNSTimer
名前が変更されました
Swift 3.0では、GCDがリファクタリングされました:
let timer : DispatchSourceTimer = DispatchSource.makeTimerSource(flags: [], queue: DispatchQueue.main)
timer.scheduleRepeating(deadline: .now(), interval: .seconds(60))
timer.setEventHandler
{
NSLog("Hello World")
}
timer.resume()
これは、特定のキューでディスパッチする必要がある場合に特に役立ちます。また、これをユーザーインターフェイスの更新に使用する予定がある場合はCADisplayLink
、GPUリフレッシュレートと同期していることを確認することをお勧めします。