天天看點

iOS開發之多線程入門 及NSThread

一、多線程入門須知

1⃣️、當使用者下載下傳資源、進行圖像處理、耗時資料處理等任務的時候  往往希望操作這個任務的時候 其他的操作不會被中斷 這時候,就用到了多線程

2⃣️、在單線程中一個線程隻能執行一個任務,一個任務處理不完另一個任務就不能開始,這樣會影響使用者的體驗,讓使用者感覺APP卡頓。現在蘋果手機都是多核處理器,這樣我們可以把一個任務分成多個步驟,在不要求順序的情況下 使用多線程既能解決線程阻塞 增加使用者體驗又能 充分利用多核處理器運作能力 

3⃣️、每個應用程式的内部,存在一個或者多個執行線程,他同時或幾乎同時執行不同的操作

4⃣️重要 面試題: 什麼是程序,什麼是線程,什麼是多線程?

     1、 線程與程序:每個系統運作的程式都是一個程序,每個程序裡面包含了一個或者多個線程

  2、 線程是一組指令的集合,程式中一個單一的順序控制流程,是一個程式中獨立運作的程式片段(一個應用程式裡面,單一的順序控制執行的一個任務)

     3、 程式運作後,系統會建立一個main 主線程的線程,所有的UI控件都必須運作在主線程裡面,是以也有人叫它UI線程   。如果将所有的任務都放在主線程裡面,就會造成UI阻塞

      4、多線程 : 在同一個應用程式内,同時運作多個線程,完成不同的工作,就叫做多線程

5⃣️、iOS 中幾種多線程方式

 iOS中有3種多線程政策供開發者使用 :NSThread、NSOperation(基類不可以直接使用 隻能使用它的子類)、GCD(Grand Central Dispatch)  

   GCD 蘋果推薦的一種實作 多線程的方式

6⃣️、輕量級 : 對系統架構的依賴性的程度

 NSThread : 是這三種政策裡面相對輕量級的,需要自己去管理它的生命周期,以及線程之間的同步,線程共享同一應用程式的部分記憶體空間,他們擁有對資料相同的通路權限,是以得協調多個線程對同一資料的通路,常用的做法是在通路之前加鎖,這會導緻一定的性能開銷

二、NSThread 詳解

設定一個白色小背景圖,我們通過點選手勢改變白色背景圖的位置為點選的位置,設定一個button,當我們點選button時下載下傳一張網絡圖檔,作為小背景圖的圖檔,在下載下傳的過程中我們無法再次點選背景圖,隻有當下載下傳完成後才能再次點選背景圖。這時,我們為了讓操作同步進行不影響,采用 多線程NSThread

iOS開發之多線程入門 及NSThread
iOS開發之多線程入門 及NSThread

1⃣️、在我們點選下載下傳button後觸發一個方法

  • (void)downLoadImage
  • {

NSThread *thread2 = [[NSThread alloc]initWithTarget:self selector:@selector(downLoadOperation) object:nil];

    thread2.name = @"下載下傳圖檔線程2";

    [thread2 start];

//    多個線程同時通路 一個資料

    NSThread *thread3 = [[NSThread alloc]initWithTarget:self selector:@selector(downLoadOperation) object:nil];

    thread3.name = @"下載下傳圖檔線程3";

    [thread3 start];

  • }
  • 2⃣️、線程觸發的方法
  • (void)downLoadOperation{

NSLog(@"下載下傳線程:%@",[NSThread currentThread]);

//    模拟 下載下傳 耗時的操作

    sleep(5);

//    當操作完成後,重新整理Ui 在主線程裡面去重新整理

//    從子線程回到主線程 去重新整理UI界面

    [self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:YES];

    point.backgroundColor = [UIColor brownColor];

}

3⃣️、下載下傳完成後,到主線程重新整理

- (void)updateUI

{

    NSLog(@"目前線程:%@",[NSThread currentThread]);

    point.backgroundColor = [UIColor brownColor];

}

繼續閱讀