CADisplayLinkで定期的に処理を実行してみる (swift4)
ちょっと定期的に実行させたい処理があったんです。
そこで今回はCADisplayLinkを使ってみようと思います。
今までも勿論そうゆうのをしている部分はあって、scheduledTimerWithTimeIntervalとかを使ってました。
1分毎とか10秒毎とか、最も短くでも1秒毎とかの定期処理なんで、そこまでタイミングにシビアではないケースでしたが。
しかし今回は1/60秒くらいで実行させたい処理で、これだけ間隔の短い定期処理を行うのにNSTimer使うのってどうなん??というばっくりした不安がありました。(結局そんな気にすることはないって話もあるかもですが…)
そんな中、「それならCADisplayLinkを使ってみるといいよ〜」と諸先輩から教えて頂きました。
これがなかなか使いやすい。
また、画面のリフレッシュレートに同期しているということで、タイミングに関する信頼性がかなり増しております(自分的に)。
CADisplayLinkの使い方
使い方は非常に簡単。
タイマーを開始したいタイミングで以下の処理を実行し、CADisplayLink設定を行うだけ。
// CADisplayLink設定 let displayLink = CADisplayLink(target: self, selector: #selector(update(_:))) //#selector部分については後述 displayLink.preferredFramesPerSecond = 20 // FPS設定 //この場合は1秒間に20回 displayLink.add(to: RunLoop.current, forMode: RunLoopMode.commonModes) //forModeについては後述
selector部分も単純に定期的に行いたいメソッドを書くだけ。
今回はprintするだけにしてます。
Swift4だとRunTimeの絡みがあるので@objcの記載を忘れずに。
@objc func update(_ displayLink: CADisplayLink) { // timeOffsetに現在時刻の秒数を設定 print("\(#function) is called! \(count)\n"); count += 1 }
displayLink.addの引数のforModeはRunLoopMode型の構造体です。
RunLoopModeについてはあんまり調べれてませんが、リファレンスを見る限り以下のような種類で設定可能な模様です。
またいじりながら実地研修したいと思います。
static let commonModes: RunLoopMode Objects added to a run loop using this value as the mode are monitored by all run loop modes that have been declared as a member of the set of “common" modes; see the description of CFRunLoopAddCommonMode(_:_:) for details. static let defaultRunLoopMode: RunLoopMode The mode to deal with input sources other than NSConnection objects. static let eventTrackingRunLoopMode: RunLoopMode A run loop should be set to this mode when tracking events modally, such as a mouse-dragging loop. static let modalPanelRunLoopMode: RunLoopMode A run loop should be set to this mode when waiting for input from a modal panel, such as NSSavePanel or NSOpenPanel. static let UITrackingRunLoopMode: RunLoopMode The mode set while tracking in controls takes place. You can use this mode to add timers that fire during tracking.
CADisplayLink、なかなか楽しかったです。
CADisplayLink - Core Animation | Apple Developer Documentation