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

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

(2014-10-17 15:06:56)

轉(zhuǎn)載

標簽:

ios

主線程

ui分類:轉(zhuǎn)載IOS

原因有2個:

1、在子線程中是不能進行UI 更新的盏求,而可以更新的結(jié)果只是一個幻像:因為子線程代碼執(zhí)行完畢了抖锥,又自動進入到了主線程亿眠,執(zhí)行了子線程中的UI更新的函數(shù)棧,這中間的時間非常的短磅废,就讓大家誤以為分線程可以更新UI纳像。如果子線程一直在運行,則子線程中的UI更新的函數(shù)棧 主線程無法獲知拯勉,即無法更新

2竟趾、只有極少數(shù)的UI能,因為開辟線程時會獲取當前環(huán)境宫峦,如點擊某個按鈕岔帽,這個按鈕響應(yīng)的方法是開辟一個子線程,在子線程中對該按鈕進行UI 更新是能及時的导绷,如換標題山卦,換背景圖,但這沒有任何意義

1诵次、程序一開始運行就進入了主線程

2、處理某些數(shù)據(jù)太過費時枚碗,影響用戶交互逾一,可以開辟子線程處理,然后通知主線程進行界面更新

測試代碼:

開辟一個多線程肮雨,直接在子線程里進行ui 更新:

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

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

}

-(void)beginTest{

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

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

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

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

}

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

2012-11-15 12:14:02.147 TestProj[2455:1b07]主線程{name = (null), num = 1}

結(jié)果:當前的確是在子線程中遵堵,但是UI馬上更新了?怨规?

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

假設(shè):如果在子線程里做了UI更新,待子線程運行完畢波丰,程序自動進入 主線程進行指定的ui更新壳坪!

問題:如果子線程沒結(jié)束呢?

在分線程中加入:

-(void)beginTest{

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

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

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

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

[NSThread sleepForTimeInterval:4.0];

}

結(jié)果:

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

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

問題:這次在分線程中add 一個button

-(void)beginTest{

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

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

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

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

UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];

[backButton setTitle:@"測試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];馬上響應(yīng)了爽蝴,但是添加的這個Button卻一直等到線程結(jié)束才繪制出來

分析:在子線程中:如果要對其他UI 進行更新,則必須等到該子線程運行結(jié)束纫骑,而對響應(yīng)用戶點擊的Button的UI更新則是及時的蝎亚!不管他是在主線程還是在子線程中做的更新,意義都不大了先馆,因為子線程中對所有其他ui更新都要等到該子線程生命周期結(jié)束才進行发框。

結(jié)論:

1、在子線程中是不能進行UI 更新的煤墙,而可以更新的結(jié)果只是一個幻像:因為子線程代碼執(zhí)行完畢了梅惯,又自動進入到了主線程宪拥,執(zhí)行了子線程中的UI更新的函數(shù)棧,這中間的時間非常的短个唧,就讓大家誤以為分線程可以更新UI江解。如果子線程一直在運行,則子線程中的UI更新的函數(shù)棧 主線程無法獲知徙歼,即無法更新

2犁河、只有極少數(shù)的UI能,因為開辟線程時會獲取當前環(huán)境魄梯,如點擊某個按鈕桨螺,這個按鈕響應(yīng)的方法是開辟一個子線程,在子線程中對該按鈕進行UI 更新是能及時的酿秸,如換標題灭翔,換背景圖,但這沒有任何意義

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辣苏,一起剝皮案震驚了整個濱河市肝箱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌稀蟋,老刑警劉巖煌张,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異退客,居然都是意外死亡骏融,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門萌狂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來档玻,“玉大人,你說我怎么就攤上這事茫藏∥笈浚” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵刷允,是天一觀的道長冤留。 經(jīng)常有香客問我,道長树灶,這世上最難降的妖魔是什么纤怒? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮天通,結(jié)果婚禮上泊窘,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好烘豹,可當我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布瓜贾。 她就那樣靜靜地躺著,像睡著了一般携悯。 火紅的嫁衣襯著肌膚如雪祭芦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天憔鬼,我揣著相機與錄音龟劲,去河邊找鬼。 笑死轴或,一個胖子當著我的面吹牛昌跌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播照雁,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蚕愤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了饺蚊?” 一聲冷哼從身側(cè)響起萍诱,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎污呼,沒想到半個月后砂沛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡曙求,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了映企。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悟狱。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖堰氓,靈堂內(nèi)的尸體忽然破棺而出挤渐,到底是詐尸還是另有隱情,我是刑警寧澤双絮,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布浴麻,位于F島的核電站,受9級特大地震影響囤攀,放射性物質(zhì)發(fā)生泄漏软免。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一焚挠、第九天 我趴在偏房一處隱蔽的房頂上張望膏萧。 院中可真熱鬧,春花似錦、人聲如沸榛泛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽曹锨。三九已至孤个,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沛简,已是汗流浹背齐鲤。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留覆享,地道東北人佳遂。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像撒顿,于是被迫代替她去往敵國和親丑罪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,665評論 2 354

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