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関数を呼び出す必要はなく、NSRunLoopaddTimer関数を介して追加することもできません.これは現在の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];
});
正常に運行するには、scheduledTimerWithXXXtimerWithXXXに両替すればいいです.
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関数を起動する必要があります.repeatsYESNOかに関わらず、タイミング関数は一回だけトリガされます.正しい使用例は以下の通りです.
__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   ), (        ,     ,           ,          ),     ,          .