定時(shí)器 NSTimer

//使用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的初始化、暫停、繼續(xù)和終結(jié)


初始化

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;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容