ios多線程之NSThread

ios多線程之NSThread

##什麼是線程: 一個進程想要執行任務,必須至少得有一個線程,可是隻擁有一個主線程,線程是進程的基本執行單位,一個進程的全部任務必須在線程中執行。 ###線程的分類: **串行:**一個一個的按順序執行。 **並行:**不按順序執行,把一個或者多個任務分配給主線程或其餘的線程進行。多線程的併發執行,實際上是CPU快速的在多個線程之間的切換。CPU切換的速度足夠快,就會形成多線程併發執行的假象。 ####ios中的:多線程編程技術: **1:**Pthread(基本不會使用)ios

**2:**NSThread(每一個Thread對象對應一個線程)編程

**3:**NSOperation(面對對象的線程技術,基於GCD來實現,是對GCD的簡單封裝)網絡

**4:**GCD(是基於C語言的框架,能夠充分利用多核,是蘋果推薦使用的多線程技術) ##NSThread: 多線程技術,只有在程序下載或者執行一些大的數據的下載,複雜大數據的增添改查中,才能體現它的特色,因此,咱們須要一些大的數據。而大的數據最好得到的是高清大圖的數據,首先在storyboard中建立 imageview: ###方式一 @interface ViewController () {多線程

NSThread *thread_A;
}

[@property](http://my.oschina.net/property) (weak, nonatomic) IBOutlet UIImageView *imagView_1;

####數據的下載: NSURL *imageURL_01 = [NSURL URLWithString:@"http://img.ivsky.com/img/tupian/pre/201507/01/yindian_meinv-001.jpg"]; NSData *data = [NSData dataWithContentsOfURL:imageURL_01]; return [UIImage imageWithData:data]; ####建立NSThread: NSThread *thread_A = [[NSThread alloc] initWithTarget:self selector:@selector(run_A) object:nil]; thread_A.name = @"線程A"; [thread_A start]; 建立線程、執行下載任務,須要手動start才能啓動。而NSThread建立的線程任務不是在主線程中的,而凡是涉及到UI的更新,都是在主線程中完成的,因此咱們須要把數據的更新操做讓給主線程 ###完成數據的更新: UIImage *image = [self downloadImage_one]; [self.imagView_1 performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO]; downloadImage_one:爲對image網絡url數據的下載。performSelectorOnMainThread:OnMainThread在主線程上執行。把對UI數據的更新放在主線程上,才能讓UI從新渲染。 ###方式二:併發

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

NewThread表明開闢一個行的線程,selector方法選擇器。開闢一個新的線程來執行所選中的方法。使用方式二,就能夠不用手動調用start方法,他會自動調用start方法。 ###方法三: 方法一二三,不少方法大同小異,最大的區別就在於建立線程的方法.框架

[self performSelectorInBackground:@selector(run_A) withObject:nil];

self當前,performSelectorInBackground:在後臺中執行選中的方法,並傳入一個對象。在後臺中開闢線程與performSelectorOnMainThread是相對的。大數據

###NSThread的一些方法:atom

####阻塞線程 [NSThread sleepForTimeInterval:5]; 等待x秒鐘。相似於GCD中的延遲調用。url

####線程暫停 [NSThread sleepUntilDate:[[NSDate date] dateByAddingTimeInterval:1000]]; 阻塞到某個時間,若是給他一個將來時間,就能讓這個線程暫停:.net

[NSThread sleepUntilDate:[NSDate distantFuture]];

####取消當前進程

[thread_A cancel];
相關文章
相關標籤/搜索