iOS 開(kāi)發(fā)中為什么更新UI都要放在主線程中祠汇?--轉(zhuǎn)

原因有2個(gè):

1仍秤、在子線程中是不能進(jìn)行UI 更新的,而可以更新的結(jié)果只是一個(gè)幻像:因?yàn)樽泳€程代碼執(zhí)行完畢了可很,又自動(dòng)進(jìn)入到了主線程诗力,執(zhí)行了子線程中的UI更新的函數(shù)棧,這中間的時(shí)間非常的短我抠,就讓大家誤以為分線程可以更新UI苇本。如果子線程一直在運(yùn)行,則子線程中的UI更新的函數(shù)棧 主線程無(wú)法獲知屿良,即無(wú)法更新2圈澈、只有極少數(shù)的UI能,因?yàn)殚_(kāi)辟線程時(shí)會(huì)獲取當(dāng)前環(huán)境尘惧,如點(diǎn)擊某個(gè)按鈕康栈,這個(gè)按鈕響應(yīng)的方法是開(kāi)辟一個(gè)子線程,在子線程中對(duì)該按鈕進(jìn)行UI 更新是能及時(shí)的喷橙,如換標(biāo)題啥么,換背景圖,但這沒(méi)有任何意義贰逾。

1悬荣、程序一開(kāi)始運(yùn)行就進(jìn)入了主線程

2、處理某些數(shù)據(jù)太過(guò)費(fèi)時(shí)疙剑,影響用戶交互氯迂,可以開(kāi)辟子線程處理,然后通知主線程進(jìn)行界面更新測(cè)試代碼:開(kāi)辟一個(gè)多線程言缤,直接在子線程里進(jìn)行ui 更新:

- (void)testUIRefresh:(UIButton *)button{

? ? ?[NSThread detachNewThreadSelector:@selector(beginTest) toTarget:self withObject:nil];

}

- (void)beginTest{

? ? NSLog(@” 當(dāng)前線程%@”,[NSThreadcurrentThread]);

? ? NSLog(@” 主線程%@”,[NSThreadmainThread]);

? ?//該button 為響應(yīng) testUIRefresh的button

? ?[self.button setTitle:@"AAA" forState:0];

}

2012-11-15 12:14:02.147 TestProj[2455:1b07]當(dāng)前線程{name = (null), num = 3}

2012-11-15 12:14:02.147 TestProj[2455:1b07]主線程{name = (null), num = 1}結(jié)果:當(dāng)前的確是在子線程中嚼蚀,但是UI馬上更新了?管挟?

結(jié)果分析:大家都說(shuō)UI更新在主線程中做轿曙,上面的結(jié)果怎么解釋

假設(shè):如果在子線程里做了UI更新,待子線程運(yùn)行完畢,程序自動(dòng)進(jìn)入 主線程進(jìn)行指定的ui更新导帝!

問(wèn)題:如果子線程沒(méi)結(jié)束呢守谓?

在分線程中加入:

-(void)beginTest{

NSLog(@” 當(dāng)前線程%@”,[NSThreadcurrentThread]);

NSLog(@” 主線程%@”,[NSThreadmainThread]);

//該button 為響應(yīng) testUIRefresh的button

[self.button setTitle:@"AAA" forState:0];

[NSThread sleepForTimeInterval:4.0];

}

結(jié)果:

self.button的title還是馬上更新了

結(jié)果分析:難道上面的假設(shè)不成立?

問(wèn)題:這次在分線程中add 一個(gè)button

-(void)beginTest{

NSLog(@” 當(dāng)前線程%@”,[NSThreadcurrentThread]);

NSLog(@” 主線程%@”,[NSThreadmainThread]);

//該button 為響應(yīng) testUIRefresh的button

[self.button setTitle:@"AAA" forState:0];

UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];

[backButton setTitle:@"測(cè)試runloop" forState:0];

[backButton setTitleColor:[UIColor redColor] forState:0];

backButton.frame = CGRectMake(100, 200, 100, 50);

[backButton addTarget:self action:@selector(testRunLoop)forControlEvents:UIControlEventTouchUpInside];

[self.window addSubview:backButton];[NSThread sleepForTimeInterval:4.0];

}

結(jié)果:[self.button setTitle:@"AAA" forState:0];之前button馬上響應(yīng)了您单,但是添加的這個(gè)Button卻一直等到線程結(jié)束才繪制出來(lái)分析:在子線程中:如果要對(duì)其他UI 進(jìn)行更新斋荞,則必須等到該子線程運(yùn)行結(jié)束,而對(duì)響應(yīng)用戶點(diǎn)擊的Button的UI更新則是及時(shí)的睹限!不管他是在主線程還是在子線程中做的更新譬猫,意義都不大了,因?yàn)樽泳€程中對(duì)所有其他ui更新都要等到該子線程生命周期結(jié)束才進(jìn)行羡疗。

結(jié)論:1、在子線程中是不能進(jìn)行UI 更新的别洪,而可以更新的結(jié)果只是一個(gè)幻像:因?yàn)樽泳€程代碼執(zhí)行完畢了叨恨,又自動(dòng)進(jìn)入到了主線程,執(zhí)行了子線程中的UI更新的函數(shù)棧挖垛,這中間的時(shí)間非常的短痒钝,就讓大家誤以為分線程可以更新UI。如果子線程一直在運(yùn)行痢毒,則子線程中的UI更新的函數(shù)棧 主線程無(wú)法獲知送矩,即無(wú)法更新。

2哪替、只有極少數(shù)的UI能栋荸,因?yàn)殚_(kāi)辟線程時(shí)會(huì)獲取當(dāng)前環(huán)境,如點(diǎn)擊某個(gè)按鈕凭舶,這個(gè)按鈕響應(yīng)的方法是開(kāi)辟一個(gè)子線程晌块,在子線程中對(duì)該按鈕進(jìn)行UI 更新是能及時(shí)的,如換標(biāo)題帅霜,換背景圖匆背,但這沒(méi)有任何意義。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末身冀,一起剝皮案震驚了整個(gè)濱河市钝尸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌搂根,老刑警劉巖珍促,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異兄墅,居然都是意外死亡踢星,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)沐悦,“玉大人成洗,你說(shuō)我怎么就攤上這事〔胤瘢” “怎么了瓶殃?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)副签。 經(jīng)常有香客問(wèn)我遥椿,道長(zhǎng),這世上最難降的妖魔是什么淆储? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任冠场,我火速辦了婚禮,結(jié)果婚禮上本砰,老公的妹妹穿的比我還像新娘碴裙。我一直安慰自己,他們只是感情好点额,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布舔株。 她就那樣靜靜地躺著,像睡著了一般还棱。 火紅的嫁衣襯著肌膚如雪载慈。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天珍手,我揣著相機(jī)與錄音办铡,去河邊找鬼。 笑死珠十,一個(gè)胖子當(dāng)著我的面吹牛料扰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播焙蹭,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼晒杈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了孔厉?” 一聲冷哼從身側(cè)響起拯钻,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎撰豺,沒(méi)想到半個(gè)月后粪般,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡污桦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年亩歹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡小作,死狀恐怖亭姥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情顾稀,我是刑警寧澤达罗,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站静秆,受9級(jí)特大地震影響粮揉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抚笔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一扶认、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧殊橙,春花似錦蝠引、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)矫夯。三九已至鸽疾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間训貌,已是汗流浹背制肮。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留递沪,地道東北人豺鼻。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像款慨,于是被迫代替她去往敵國(guó)和親儒飒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344