//使用scheduledTimerWithTimeInterval方法會(huì)把timer添加到mainRunLoop,但是其模式是NSDefaultRunLoopMode,當(dāng)主線程忙的時(shí)候是不會(huì)執(zhí)行該定時(shí)器的。
NSTimer*timer = [NSTimer ?scheduledTimerWithTimeInterval:60 ?target:self ? selector:@selector(setupUnreadCount) ? userInfo:nil ?repeats:YES];
//改變定時(shí)器的模式為NSRunLoopCommonModes,該模式下主線程會(huì)抽時(shí)間處理一下timer(不管主線程是否正在其他事件)
[[NSRunLoop ?mainRunLoop] addTimer:timer ?forMode:NSRunLoopCommonModes];
初始化
NSTimer的初始化一般都是使用類方法,類方法有四個(gè),主要區(qū)別就是是否使用scheduled和NSInvocation。
先說scheduled,初始化時(shí)使用了scheduled就就相當(dāng)于以默認(rèn)mode添加到NSRunLoop中,初始化后指定方法會(huì)被直接調(diào)用,
未使用scheduled不會(huì)直接調(diào)用指定方法,需要調(diào)用[NSRunLoop ?currentLoop]的方法addTimer:forMode:方法,
手動(dòng)把NSTimer對(duì)象添加到NSRunLoop中后才會(huì)調(diào)用指定方法。
接下來再說NSInvocation的作用,使用selector只能傳遞一個(gè)參數(shù),但是當(dāng)你的方法需要傳遞多個(gè)參數(shù)時(shí)怎么辦?
這時(shí)就需要用到NSInvocation了,NSInvacation可以實(shí)現(xiàn)方法的多參數(shù)傳遞,具體用法我就不在這里多說了,讀者可以自行查找。
除了上面說的4個(gè)類方法外,NSTimer還有一個(gè)對(duì)象方法,利用FireDate進(jìn)行初始化,內(nèi)容很簡單無歧義,不再多說。
暫停
NSTimer沒有提供直接的暫停方法,我們只有自己想辦法來間接實(shí)現(xiàn)暫停效果,這里采用的方法就是利用NSTimer的屬性fireDate。
fireDate的作用就是在指定的時(shí)間開啟NSTimer。只要我們?cè)O(shè)置的開啟時(shí)間夠長,作用就相當(dāng)于是暫停了。
[_timer ?setFireDate:[NSDate distantFuture]];
繼續(xù)
NSTimer的繼續(xù)原理和暫停是一樣的,都是利用FireDate。
[_timer setFireDate:[NSDate date]];
終結(jié)
NSTimer的終結(jié),系統(tǒng)給了方法
[_timer invalidate];
_timer = nil;