MILLEN BOX

音楽好きの組み込みソフトエンジニアによるプログラミング(主にiOSアプリ開発)の勉強の記録

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