iOS RunLoop整理

一荒椭、RunLoop的基本作用

1.保持程序的持續(xù)運(yùn)行(比如主程序循環(huán)跪另,在啟程動(dòng)main函數(shù)的時(shí)候跪妥,會(huì)在主線程中開啟一個(gè)死循環(huán)岳枷,保證程序能夠一直運(yùn)行)

2.處理程序中的各種事件(用戶交互事件,定時(shí)器事件垒探,Selector事件)

3.在無各種事件觸發(fā)的時(shí)候妓蛮,節(jié)省CPU資源,事件需要時(shí)才調(diào)用CPU

二圾叼、RunLoop的API使用

1.關(guān)于RunLoop的使用有兩套API蛤克,NSRunLoop(OC語言)和CFRunLoopRef(C語言),其中前者是對(duì)后者的封裝

2.一般來說夷蚊,使用NSRunLoop构挤,獲取當(dāng)前線程的RunLoop的方式為[NSRunLoop currentRunLoop]

三、RunLoop在實(shí)際開發(fā)中的使用

RunLoop的常用模式有兩種:NSDefaultRunLoopMode 和 UITrackingRunLoopMode惕鼓,其他模式?jīng)]用或者可用性不大

0.①每條線程都有唯一的一個(gè)與之對(duì)應(yīng)的RunLoop對(duì)象筋现,主線程的RunLoop在程序開始的main函數(shù)中就已經(jīng)自動(dòng)創(chuàng)建好了 ,子線程的RunLoop需要開發(fā)者主動(dòng)創(chuàng)建

②子線程中的創(chuàng)建 :RunLoop在第一次獲取時(shí)箱歧,即使用[NSRunLoop currentRunLoop]獲取RunLoop時(shí)創(chuàng)建矾飞,在子線程結(jié)束時(shí)銷毀

1.NSTimer定時(shí)器的應(yīng)用

NSTimer默認(rèn)被添加到NSDefaultRunLoopMode模式下。當(dāng)NSTimer處于NSDefaultRunLoopMode時(shí)(比如頁面滑動(dòng))呀邢,定時(shí)器會(huì)在RunLoop會(huì)在其他模式下失效洒沦,直到RunLoop回到NSDefaultRunLoopMode模式,想要NsTimer在其他模式下也可以正常工作价淌,就需要手動(dòng)修改NSTimer在RunLoop下的模式申眼。

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

2.ImageView

讓某些事件或行為讓特性模式下執(zhí)行。

像微信中的那樣蝉衣,當(dāng)用戶在滑動(dòng)頁面操作時(shí)括尸,為了減少CPU的使用,保證頁面滑動(dòng)的流暢性病毡,不顯示圖片濒翻,在滑動(dòng)動(dòng)作結(jié)束后方顯示圖片。對(duì)于這樣的功能剪验,就可以使用runloop肴焊,把imageview setImage:這一操作放在NSDefaultRunLoopMode模式下:

[imageView performSelector:@selector(setImage:) withObject:[UIImage imageNamed:@"imageName"] afterDelay:3.0 inModes:@[NSDefaultRunLoopMode]];

當(dāng)然,也可以監(jiān)聽scrollview的滑動(dòng)功戚。

類似的娶眷,如果有其他類似的需求,都可以調(diào)用 performSelector:withObject: afterDelay: inModes方法

3.保障子線程的存活

在我們不希望我們自己開辟的子線程在完成任務(wù)的時(shí)候就銷毀啸臀,就可以使用RunLoop保障子線程的存活届宠。

操作很簡單,在子線程中調(diào)用

[[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode];

//開啟runloop

[[NSRunLoop currentRunLoop] run]; // (不建議使用該方法,無法退出)

或者

[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];

或者

[[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantFuture]];

在需要銷毀線程時(shí)乘粒,使用[NSThread exit];

四豌注、補(bǔ)充

NSTimer因?yàn)闀?huì)可能受到Runloop的模式影響,存在時(shí)間不準(zhǔn)時(shí)的情況灯萍。GCD做的定時(shí)器不受RunLoop影響轧铁。不管在子線程還是主線程。

@property (nonatomic, strong) dispatch_source_t timer;

int count = 0;

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

// 根據(jù)實(shí)際情況獲得所需的隊(duì)列

//? ? dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

dispatch_queue_t queue = dispatch_get_main_queue();

// 創(chuàng)建一個(gè)定時(shí)器(dispatch_source_t本質(zhì)還是個(gè)OC對(duì)象)

self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);

// 設(shè)置定時(shí)器的各種屬性(幾時(shí)開始任務(wù)旦棉,每隔多長時(shí)間執(zhí)行一次)

// GCD的時(shí)間參數(shù)齿风,一般是納秒 NSEC_PER_SEC(1秒 == 10的9次方納秒)

// 何時(shí)開始執(zhí)行第一個(gè)任務(wù)

// dispatch_time(DISPATCH_TIME_NOW, 3.0 * NSEC_PER_SEC) 比當(dāng)前時(shí)間晚3秒

dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC));

uint64_t interval = (uint64_t)(1.0 * NSEC_PER_SEC);

dispatch_source_set_timer(self.timer, start, interval, 0);

// 設(shè)置回調(diào)

dispatch_source_set_event_handler(self.timer, ^{

NSLog(@"----%@", [NSThread currentThread]);

count++;

//? ? ? ? if (count == 4) {

//? ? ? ? ? ? // 取消定時(shí)器

//? ? ? ? ? ? dispatch_cancel(self.timer);

//? ? ? ? ? ? self.timer = nil;

//? ? ? ? }

});

// 啟動(dòng)定時(shí)器

dispatch_resume(self.timer);

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市绑洛,隨后出現(xiàn)的幾起案子救斑,更是在濱河造成了極大的恐慌,老刑警劉巖真屯,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脸候,死亡現(xiàn)場離奇詭異,居然都是意外死亡绑蔫,警方通過查閱死者的電腦和手機(jī)运沦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晾匠,“玉大人茶袒,你說我怎么就攤上這事×构荩” “怎么了薪寓?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長澜共。 經(jīng)常有香客問我向叉,道長,這世上最難降的妖魔是什么嗦董? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任母谎,我火速辦了婚禮,結(jié)果婚禮上京革,老公的妹妹穿的比我還像新娘奇唤。我一直安慰自己幸斥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布咬扇。 她就那樣靜靜地躺著甲葬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪懈贺。 梳的紋絲不亂的頭發(fā)上经窖,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音梭灿,去河邊找鬼画侣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛堡妒,可吹牛的內(nèi)容都是我干的配乱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼皮迟,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼宪卿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起万栅,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤佑钾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后烦粒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體休溶,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年扰她,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兽掰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡徒役,死狀恐怖孽尽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情忧勿,我是刑警寧澤杉女,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站鸳吸,受9級(jí)特大地震影響熏挎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜晌砾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一坎拐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦哼勇、人聲如沸都伪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽院溺。三九已至,卻和暖如春磅轻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背逐虚。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國打工聋溜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叭爱。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓撮躁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親买雾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子把曼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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