IOS 多線程 NSThread – iPhone手機開發 iPhone軟體開發教學課程

一個正在運行的應用程序是一個進程,一個進程會默認開啟一個主線程,但是在主線程中的操作是串行的,也就是當有多個任務同時需要完成的時候,是按照順序一個個執行。因此,為瞭提高效率,會在進程中開啟多個線程,每個線程可以並行的執行不同的任務。

 

  此外,在ios程序中,處理用戶觸摸事件、刷新界面等操作是必須放到主線程中實現的,因此那些比較耗費資源的,比如從網絡獲取數據、下載等操作可以放到子線程中,不然的話,很容易造成主線程阻塞,一旦主線程阻塞,就會出現卡頓的現象,影響用戶體驗。

 

  在ios中,使用多線程有三種方式,分別是:

 

(1)NSThread

 

  NSThread是一種比較原始的使用線程的方式,它是輕量級的方式,與其他方式相比,能更直觀的控制線程對象。但是通過這種方式,需要管理線程的生命周期,如果想實現同步,還需要加鎖,會加大系統開銷。

 

(2)NSOperation和NSOperationQueue

 

NSOperation以面向對象的方法封裝瞭需要執行的操作,然後將這個操作放到一個NSOperationQueue中異步執行,不需要去管理線程與處理同步的問題。

 

(3)Grand Centeral Dispatch

 

簡稱GCD,是c語言的API。GCD中提供瞭一些新特性來實現設備多核的並行編程。

 

在本篇文章,我們先來講解一下NSThread的使用。

 

NSThread

 

NSThread是線程類,一個NSThread實例就代表是一個線程。

 

獲取主線程

 

代碼

 

NSThread *mainThread = [NSThread mainThread];

獲取當前線程

 

代碼

 

NSThread *currentThread = [NSThread currentThread];

NSThread創建

 

(1)動態方法:通過對象方法來創建線程,需要手動開啟線程  

 

代碼

 

 

//初始化線程
NSThread *thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(startThread:) object: @"ios"];
thread1.name = @"thread1";
//開啟線程
[thread1 start];
 

 

通過開啟線程調用的方法

 

代碼

 

 

-(void)startThread:(NSString *)parm{
    
    NSThread *currentThread = [NSThread currentThread];
    
    for (int i=0; i<10; i++) {
        NSLog(@"參數為 %@, 當前的線程為 %@, 線程的名字為 %@",parm,currentThread,currentThread.name);
    }
}
 

 

 

(2)靜態方法:通過類方法開啟線程,系統自動調用

 

代碼

 

[NSThread detachNewThreadSelector:@selector(startThread:) toTarget:self withObject:@"jredu"];

(3)隱式方法開啟線程

 

代碼

 

[self performSelectorInBackground:@selector(startThread:) withObject:@"apple"];

暫停當前的線程

 

代碼

 

 

//方法一
[NSThread sleepForTimeInterval:2];

//方法二
NSDate *date = [NSDate dateWithTimeInterval:2 sinceDate:[NSDate date]];
[NSThread sleepUntilDate:date];

 

在某個線程上執行操作

 

(1)在指定線程執行操作

 

代碼

 

[self performSelector:@selector(run) onThread:thread1 withObject:nil waitUntilDone:YES];

(2)在主線程執行操作

 

代碼

 

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

(3)在當前線程執行操作

 

代碼

 

[self performSelector:@selector(run) withObject:nil]; 

發佈留言