RunLoop&NSTimer結合使用.md
2208 ワード
NSTimer
には、2つのタイプの初期化方法があり、1つはscheduledTimerWithXXX
であり、1つはtimerWithXXX
である.scheduledTimerWithXXX:Creates and returns a new NSTimer oject and schedules it on the current run loop in the default mode.
RunLoop
に自動的に追加されます.この方法はメインスレッドでしか使用できないので、
fire
関数を呼び出す必要はなく、NSRunLoop
のaddTimer
関数を介して追加することもできません.これは現在のRunLoop
に自動的に追加されます.例えば、以下のような書き方では、タイミング関数は起動されません.addTimer
の行のコードを注釈しても、タイミング関数は正常に呼び出されません.__weak __typeof(&*self) weakself = self;
dispatch_async(dispatch_get_global_queue(0, 0), ^{
weakself.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(timerFired) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:weakself.timer forMode:NSRunLoopCommonModes];
});
正常に運行するには、scheduledTimerWithXXX
をtimerWithXXX
に両替すればいいです.timerWithXXX:Creates and returns a new NSTimer object initialized with the specified oject and selector.初期化
NSTimer
は、手動でRunLoop
に追加する必要があります.メインスレッドで初期化すると、次のコードがあります.
self.timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(timerFired) userInfo:nil repeats:YES];
[self.timer fire];
fire
関数を起動する必要があります.repeats
がYES
かNO
かに関わらず、タイミング関数は一回だけトリガされます.正しい使用例は以下の通りです.__weak __typeof(&*self) weakself = self;
dispatch_async(dispatch_get_global_queue(0, 0), ^{
weakself.timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(timerFired) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:weakself.timer forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] run]; // ,
});```
> : [www.cnblogs.com/liyang31tg/p/3662557.html](http://www.cnblogs.com/liyang31tg/p/3662557.html)
NSRunLoop , NSRunLoop , , , , NSRunLoop , , , [[NSRunLoop currentRunLoop] run]; ( , , ( , ,GCD ), ( , , , ), , .