面白きことは良きことなり

拙く未熟なiOSエンジニアの備忘録と戯言

NSTimerでinitとscheduledTimerWithTimeIntervalは別物ということを知った話

NSTimerで処理を書いた際、repeatsをtrueにしているのに繰り返し処理してくれないで悩んだことがあった。

initメソッドの

public /*not inherited*/ init(timeInterval ti: NSTimeInterval, target aTarget: AnyObject, selector aSelector: Selector, userInfo: AnyObject?, repeats yesOrNo: Bool)

とclassメソッドの

public class func scheduledTimerWithTimeInterval(ti: NSTimeInterval, target aTarget: AnyObject, selector aSelector: Selector, userInfo: AnyObject?, repeats yesOrNo: Bool) -> NSTimer

は別物ということを教わった。
昔やった気もするし、今更な話ではあるが。


処理の違いとして下記の差がある。両方は同じ処理をする作りとなっている。

// 自動発火&自動repeat
let timer = NSTimer.scheduledTimerWithTimeInterval(0.5,
                                                   target: self,
                                                   selector: #selector(hoge),
                                                   userInfo: nil,
                                                   repeats: true)
// repeatさせない際、fire()で発火必要
// repeatさせる際、NSRunLoopを使用する処理が必須(自動発火するのでfire()は不要)
let timer = NSTimer(timeInterval: 0.5,
                    target: self,
                    selector: #selector(hoge),
                    userInfo: nil,
                    repeats: true)
let runLoop = NSRunLoop.currentRunLoop()
runLoop.addTimer(timer, forMode: NSRunLoopCommonModes)