NSTimer

  1. 父類是NSObject
  • 名稱:“定時器”
  • 作用:
    • 在指定的時間執(zhí)行指定的任務
    • 每隔一段時間執(zhí)行指定的任務

使用方法

  1. 開啟一個定時任務
//每隔ti秒,調(diào)用一次aTarget的aSelector方法,yesOrNo決定了是否重復執(zhí)行這個任務.
//會返回一個NSTimer類型的指針,讓其成為控制器的成員變量,方便日后關(guān)閉定時器,因為定時器的關(guān)閉方法是對象方法
+(NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti       target:(id)aTarget
    selector:(SEL)aSelector
    userInfo:(id)userInfo
    repeats:(BOOL)yesOrNo;
    ```

- 停止定時器
```objc
//一旦定時器被停止了,就不能再次執(zhí)行任務。只能再創(chuàng)建一個新的定時器才能執(zhí)行新的任務
-(void)invalidate;

解決定時器在主線程不工作的問題

//創(chuàng)建新的NSTimer,并每隔2秒后執(zhí)行'next'方法,返回指針
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(next) userInfo:nil repeats:YES];
//讓主線程抽空關(guān)注Timer的執(zhí)行
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

NSTimer與Runloop

/*
    說明:
    (1)runloop一啟動就會選中一種模式,當選中了一種模式之后其它的模式就動不了。一個mode里面可以添加多個NSTimer,也就是說以后當創(chuàng)建NSTimer的時候,可以指定它是在什么模式下運行的。
    (2)它是基于時間的觸發(fā)器,說直白點那就是時間到了我就觸發(fā)一個事件,觸發(fā)一個操作。基本上說的就是NSTimer;往runloop中添加一個定時器事件,該定時器事件運行在默認運行模式下面

    (3)相關(guān)代碼
*/
- (void)timer2
{
    //NSTimer 調(diào)用了scheduledTimer方法,那么會自動添加到當前的runloop里面去,而且runloop的運行模式kCFRunLoopDefaultMode

    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];

    //更改模式
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

}

- (void)timer1
{
    //    [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];

    NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];

    //定時器添加到UITrackingRunLoopMode模式,一旦runloop切換模式,那么定時器就不工作
    //    [[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];

    //定時器添加到NSDefaultRunLoopMode模式,一旦runloop切換模式,那么定時器就不工作
    //    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

    //占位模式:common modes標記
    //被標記為common modes的模式 kCFRunLoopDefaultMode  UITrackingRunLoopMode
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

    //    NSLog(@"%@",[NSRunLoop currentRunLoop]);


    //Mode表示runloop的運行模式
    //設置添加到runloop的NSDefaultRunLoopMode運行模式下
    /*
     //NSDefaultRunLoopMode 表示只有當runloop的運行模式處于默認模式的情況寫才工作,其他模式不工作
     //    [[NSRunLoop currentRunLoop]addTimer:timer forMode:NSDefaultRunLoopMode];
     */

    //設置添加到runloop的UITrackingRunLoopMode運行模式下
    /*
     //UITrackingRunLoopMode 表示只有當runloop的運行模式處于界面跟蹤的情況才工作,其他模式不工作
     //    [[NSRunLoop currentRunLoop]addTimer:timer forMode:UITrackingRunLoopMode];
     */

    //設置添加到所有被標記為NSRunLoopCommonModes的運行模式下
    /*
    NSRunLoopCommonModes占位模式:意味著吧timer添加到所有被標記為NSRunLoopCommonModes的運行模式下面
    被標記為NSRunLoopCommonModes的所有運行模式:
        UITrackingRunLoopMode|kCFRunLoopDefaultMode

     0 : <CFString 0x10aa0ca40 [0x109b817b0]>{contents = "UITrackingRunLoopMode"}
     2 : <CFString 0x109ba1b40 [0x109b817b0]>{contents = "kCFRunLoopDefaultMode"}
}

- (void)run
{
    NSLog(@"---run---%@",[NSRunLoop currentRunLoop].currentMode);
}

- (IBAction)btnClick {

    NSLog(@"---btnClick---");
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • 一、什么是NSRunLoop NSRunLoop是消息機制的處理模式 NSRunLoop的作用在于有事情做的時候使...
    lbfly_boy閱讀 481評論 0 2
  • 一、什么是NSRunLoop NSRunLoop是消息機制的處理模式 NSRunLoop的作用在于有事情做的時候使...
    呦釋原點閱讀 665評論 0 2
  • 一、什么是NSRunLoop NSRunLoop是消息機制的處理模式 NSRunLoop的作用在于有事情做的時候使...
    KK_boy閱讀 520評論 0 0
  • 參考資料 NSTimer深入理解RunLoop《編寫高質(zhì)量iOS與OS X代碼的52個有效方法》中第52條:別忘了...
    水止云起閱讀 722評論 0 0
  • NSTimer是iOS最常用的定時器工具之一,在使用的時候常常會遇到各種各樣的問題,最常見的是內(nèi)存泄漏,通常我們使...
    bomo閱讀 1,243評論 0 7