我們把一些耗時操作放在子線程,例如下載圖片,但是下載完畢我們不能在子線程更新UI,因為只有主線程才可以更新UI和處理用戶的觸摸事件,否則程式會崩潰。此時,我們就需要把子線程下載完畢的數據傳遞到主線程,讓主線程更新UI,這就是線程間的通信。 原理 代碼 日誌 &em ...
我們把一些耗時操作放在子線程,例如下載圖片,但是下載完畢我們不能在子線程更新UI,因為只有主線程才可以更新UI和處理用戶的觸摸事件,否則程式會崩潰。此時,我們就需要把子線程下載完畢的數據傳遞到主線程,讓主線程更新UI,這就是線程間的通信。
原理
代碼
// 點擊屏幕開始下載圖片
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
NSLog(@"當前線程1=%@",[NSThread currentThread]);
NSThread *thread = [[NSThread alloc] initWithBlock:^{
NSLog(@"當前線程2=%@",[NSThread currentThread]);
NSString *strURL = @"http://pic33.nipic.com/20130916/3420027_192919547000_2.jpg";
UIImage *image = [self downloadImageWithURL:strURL];
if (image) {
[self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];
}
}];
[thread start];
}
日誌
2016-11-04 13:47:04.532 TTTTTTTTTT[10584:122182] 當前線程1=<NSThread: 0x600000260c80>{number = 1, name = main}
2016-11-04 13:47:04.533 TTTTTTTTTT[10584:122269] 當前線程2=<NSThread: 0x600000265d80>{number = 3, name = (null)}
子線程與主線程的回調應用的非常普遍。因為我們下載的數據大多數情況都是為了更新UI或者處理用戶的觸摸事件。其實在開發中,我們用NSThread的次數並不多,因為線程的同步、加鎖都會造成一定的性能開銷,我們還要手動管理線程的生命周期,很麻煩。開發的時候我們最多用的就是[NSThread currentThread]這個方法來判斷一下當前線程。
這一篇應該是關於NSThread最後一篇文章了,從下一篇開始講GCD。