先日、タイマーにて時間を計っている時に、
テーブルのセルをスクロール時にタイマーが停止してしまう
問題が発生し、解決方法を調査しました。
まず最初、下記の方法にて設定していました。
NSTimer *tm = [ NSTimer scheduledTimerWithTimeInterval :0.5f target:self selector:@selector(onUpdate:) userInfo:nil repeats:YES ];
どうも、この方法だと、メインスレッドにて動作しているらしく、
UIの操作もメインスレッドのため、UI操作時はタイマーが
止まってしまいます。
特にひどいのが、
UIScrollVIew
UITableVIew
でした。
そこで、NSRunLoop へ登録することにしました。
NSTimer *tm = [ NSTimer timerWithTimeInterval:0.5f target:self selector:@selector(onUpdate:) userInfo:nil repeats:YES ]; [ [NSRunLoop currentRunLoop] addTimer:tm forMode: NSDefaultRunLoopMode ];
ちなみに、NSRunLoop へ登録する場合は、
timerWithTimeInterval
を利用します。(この時点では、タイマーは開始されない)
[ [NSRunLoop currentRunLoop] addTimer: forMode:NSDefaultRunLoopMode ];
はだめで、
NSDefaultRunLoopMode だと、メインメッソドにて
動作するようです。
よって、別スレッドにてタイマーを処理させたい場合は、
下記にて、別スレッド動作しました。
NSTimer *tm = [ NSTimer timerWithTimeInterval:0.5f target:self selector:@selector(onUpdate:) userInfo:nil repeats:YES ]; [ [NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes ];
これにて、UI操作時もタイマー処理がされるようになりました。