IOS 多線程 NSThread
一個正在啟動並執行應用程式是一個進程,一個進程會預設開啟一個主線程,但是在主線程中的操作是串列的,也就是當有多個任務同時需要完成的時候,是按照順序一個個執行。因此,為了提高效率,會在進程中開啟多個線程,每個線程可以並行的執行不同的任務。 此外,在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];