NSTimer

ここでは、NSTimer の使い方についてメモしていく。

あまりよくわかっていないので、とりあえず使ってみてできたことから。

NSTimer では、時間を設定(インターバル)して、その時間ごとに何かをさせるときに使う。

scheduledTimerWithTimeInterval_target_selector_userInfo_repeats(interval,target,selector,userinfo,true/false) で設定してみた。

interval は秒数で、target はその後の selector を送るオブジェクト。普通は、スクリプトが書いてある AppController なんかなので、self でいい。selector は実行するメソッド、userinfo はどこみても nil が入っていたので、nil にした。最後を true にするとインターバルごとに繰り返す。false だと一度で終わり。

@timer = NSTimer.scheduledTimerWithTimeInterval_target_selector_userInfo_repeats(0.1,self,:updateTimer,nil,true)

これを止めるには、invalidate を使う。

@timer.invalidate

ちょっとしたサンプル。これは、今の時点で試してみてるものだけど、もっといい方法があれば書き換えていく。

QuickTime の現在時間を得る簡単な方法が QTMovie クラスにはないので、NSTimer を使う。NSTimer の設定は awakeFromNib など、nib ファイルが読まれた時点で行うようにする。(Document-based アプリケーションの場合は、Document を閉じた時点で invalidate した方がいいと思うけど、しなくても大丈夫かもしれない)。

def awakeFromNib

@timer = NSTimer.scheduledTimerWithTimeInterval_target_selector_userInfo_repeats(0.1,self,:updateTimer,nil,true)

end

これで、0.1 秒ごとに updateTimer というメソッドが実行される。これをもっと小さい値にすれば、正確さが増すけど負担も増える(と思う)。0.5 秒だと、表示と実際の時間のずれが大きくなる。

ここでは、@qtMovie という QTMovie オブジェクトの現在時間を 00:00:00 というフォーマットで表示することにする。要は、ムービーが動いていないときに表示を更新しなければいいので、rate で現在の再生スピードを得て、0.0 なら更新しなくすればいい。あと、NSTimer は設定したら、その時点から動き始めるので、@qtMovie が nil のときには rate を使わないようにする。if で条件は前から順番に確認されていくので、最初に @qtMovie.nil? をおいて、次に @qtMovie.rate == 0.0 を確認するようにする。

def updateTimer(timer)

return if @qtMovie.nil? || @qtMovie.rate == 0.0

@currentTimeText.setStringValue(QTStringFromTime(@qtMovie.currentTime).to_s.match(/\d\d:\d\d:\d\d/).to_s)

end