iOS RunLoop在實際開發(fā)中的應用

概要

在iOS開發(fā)中狼忱,Runtime與RunLoop應該是iOS Developer技術(shù)進階時需要掌握的兩方面知識,相對來說一睁,它倆也比較接近底層钻弄,就現(xiàn)在環(huán)境來看,面試時也比較容易問到者吁。

關(guān)于這兩項窘俺,網(wǎng)上的文章大多是講了很多知識點,然而實際開發(fā)中用不到复凳,那就找一個很簡單的問題來把這兩項知識實戰(zhàn)一下

鎖屏或切換至后臺時計時器停止

相信大家都遇到過的問題:在注冊頁面有一個NSTimer實現(xiàn)的驗證碼倒計時的按鈕瘤泪,在手機切出app,把app在后臺掛起時育八,倒計時是停止的对途,如你切出時時間剩余50秒,當你從后臺返回時髓棋,倒計時依然是50秒实檀。

什么原因惶洲?

如果你有關(guān)于RunLoop的知識,你應該知道

  • 每一個線程都有一個自己的RunLoop膳犹,他們的關(guān)系是一一對應的
  • NSTimer 其實就是 CFRunLoopTimerRef

上面兩點不懂可以來這里 -- 深入理解RunLoop

CFRunLoopTimerRef 是基于時間的觸發(fā)器恬吕,它和 NSTimer 是toll-free bridged 的,可以混用须床。其包含一個時間長度和一個回調(diào)(函數(shù)指針)币呵。當其加入到 RunLoop 時,RunLoop會注冊對應的時間點侨颈,當時間點到時余赢,RunLoop會被喚醒以執(zhí)行那個回調(diào)

 簡單來說就是NSTimer在初始化以后,必須被加入到RunLoop中才會生效
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats

使用此方法初始化時哈垢,會自動將我們創(chuàng)建的NSTimer加入到RunLoop中

造成NSTimer停止的原因妻柒,是當app在后臺掛起時,線程同時被掛起耘分,RunLoop也就被掛起举塔,而NSTimer是運行在RunLoop中的,所以在app掛起時求泰,NSTimer就同時停止了工作央渣。

關(guān)于NSTimer想更深入的可以參考iOS開發(fā)之 不要告訴我你會用NSTimer!

怎么解決?

知道了NSTimer停止的原因是因為線程不活躍

那解決NSTimer停止的方法就是app在掛起時渴频,讓其所在RunLoop的線程處于活躍狀態(tài)

我們需要的是UIApplication的:

- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void(^ __nullable)(void))handler

這個方法芽丹,這個方法就是開啟一個后臺任務,使線程處于活躍狀態(tài)便于執(zhí)行此后臺任務卜朗,線程活躍了拔第,NSTimer也就可以繼續(xù)跑下去不會停止,當然這個方法只能讓主線程活躍180秒场钉,

- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void(^ __nullable)(void))handler

- (void)endBackgroundTask:(UIBackgroundTaskIdentifier)identifier

是一對蚊俺,你調(diào)用了前者開啟了一個后臺任務,就要調(diào)用后者來結(jié)束這個任務

// AppDelegate 中聲明一個標識
 @property (nonatomic, unsafe_unretained) UIBackgroundTaskIdentifier backgroundTaskIdentifier;

然后在app進入后臺時

- (void)applicationDidEnterBackground:(UIApplication *)application{
    // 返回一個任務標識
    self.backgroundTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void){
        //  申請的時間到期后進入這里逛万,即馬上將被掛起泳猬,不再活躍
         [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskIdentifier];
        //  將標識符標記為 UIBackgroundTasksInvalid,任務結(jié)束
        self.backgroundTaskIdentifier = UIBackgroundTaskInvalid; 
    }];
}

當然如果app切回來的話也要把任務結(jié)束

- (void)applicationDidBecomeActive:(UIApplication *)application {
    
     [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskIdentifier];
     self.backgroundTaskIdentifier = UIBackgroundTaskInvalid;
}

到此我們解決了一個關(guān)于定時器停止的問題,看似解決問題的是開啟/結(jié)束 后臺任務的兩個方法宇植,但實際上是我們運用了RunLoop的知識來解決的得封,這是RunLoop知識運用在實際開發(fā)中的一個案例

對了上述我們用到的方法也可以用于解決程序掛起時的復雜操作

比如需要在程序掛起時向服務器post一些數(shù)據(jù),以前做的一款產(chǎn)品就是要收集各種操作信息当纱,收集用戶的操作路徑啊云云呛每,包括用戶切換至后臺這樣的操作都要收集踩窖。
用這個方法同樣可以解決坡氯,但是要注意:

post要用同步方法,保證在主線程里進行

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市箫柳,隨后出現(xiàn)的幾起案子手形,更是在濱河造成了極大的恐慌,老刑警劉巖悯恍,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件库糠,死亡現(xiàn)場離奇詭異,居然都是意外死亡涮毫,警方通過查閱死者的電腦和手機瞬欧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來罢防,“玉大人艘虎,你說我怎么就攤上這事≈渫拢” “怎么了野建?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長恬叹。 經(jīng)常有香客問我候生,道長,這世上最難降的妖魔是什么绽昼? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任唯鸭,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘驻呐。我一直安慰自己习柠,他們只是感情好,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布停做。 她就那樣靜靜地躺著,像睡著了一般大莫。 火紅的嫁衣襯著肌膚如雪蛉腌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天只厘,我揣著相機與錄音烙丛,去河邊找鬼。 笑死羔味,一個胖子當著我的面吹牛河咽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赋元,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼忘蟹,長吁一口氣:“原來是場噩夢啊……” “哼飒房!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起媚值,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤狠毯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后褥芒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嚼松,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年锰扶,在試婚紗的時候發(fā)現(xiàn)自己被綠了献酗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡坷牛,死狀恐怖凌摄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情漓帅,我是刑警寧澤锨亏,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站忙干,受9級特大地震影響器予,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捐迫,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一乾翔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧施戴,春花似錦反浓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肪笋,卻和暖如春月劈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背藤乙。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工猜揪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坛梁。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓而姐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親划咐。 傳聞我的和親對象是個殘疾皇子拴念,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

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