【Obj-C】NSTimer を別スレッドにて実行する方法

先日、タイマーにて時間を計っている時に、

テーブルのセルをスクロール時にタイマーが停止してしまう

問題が発生し、解決方法を調査しました。

まず最初、下記の方法にて設定していました。

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操作時もタイマー処理がされるようになりました。

タイトルとURLをコピーしました