- 父類是NSObject
- 名稱:“定時器”
- 作用:
- 在指定的時間執(zhí)行指定的任務
- 每隔一段時間執(zhí)行指定的任務
使用方法
- 開啟一個定時任務
//每隔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---");
}