iOS 開發中為什么更新UI都要放在主線程中?--轉

iOS 開發中為什么更新UI都要放在主線程中?--轉

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

轉載

標簽:

ios

主線程

ui分類:轉載IOS

原因有2個:

1、在子線程中是不能進行UI 更新的,而可以更新的結果只是一個幻像:因為子線程代碼執行完畢了,又自動進入到了主線程,執行了子線程中的UI更新的函數棧,這中間的時間非常的短,就讓大家誤以為分線程可以更新UI。如果子線程一直在運行,則子線程中的UI更新的函數棧 主線程無法獲知,即無法更新

2、只有極少數的UI能,因為開辟線程時會獲取當前環境,如點擊某個按鈕,這個按鈕響應的方法是開辟一個子線程,在子線程中對該按鈕進行UI 更新是能及時的,如換標題,換背景圖,但這沒有任何意義

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

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

測試代碼:

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

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

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

}

-(void)beginTest{

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

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

//該button 為響應 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}

結果:當前的確是在子線程中,但是UI馬上更新了??

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

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

問題:如果子線程沒結束呢?

在分線程中加入:

-(void)beginTest{

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

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

//該button 為響應 testUIRefresh的button

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

[NSThread sleepForTimeInterval:4.0];

}

結果:

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

結果分析:難道上面的假設不成立?

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

-(void)beginTest{

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

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

//該button 為響應 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];

}

結果:[self.button setTitle:@"AAA" forState:0];馬上響應了,但是添加的這個Button卻一直等到線程結束才繪制出來

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

結論:

1、在子線程中是不能進行UI 更新的,而可以更新的結果只是一個幻像:因為子線程代碼執行完畢了,又自動進入到了主線程,執行了子線程中的UI更新的函數棧,這中間的時間非常的短,就讓大家誤以為分線程可以更新UI。如果子線程一直在運行,則子線程中的UI更新的函數棧 主線程無法獲知,即無法更新

2、只有極少數的UI能,因為開辟線程時會獲取當前環境,如點擊某個按鈕,這個按鈕響應的方法是開辟一個子線程,在子線程中對該按鈕進行UI 更新是能及時的,如換標題,換背景圖,但這沒有任何意義

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容