NSThread多線程和GCD多線程

NSThread多線程
NSThread兩種方式
[NSThread detachNewThreadSelection:@selector()toTarget:self withObject:nil];
NSThread * thread = [[NSThread alloc] initWithTarget:self selector:@selector() object:nil]這個需要我們手動開啓[thread start] 
我們要注意的是子線程一旦開啓是不會銷燬的,我們需要在執行的方法裏添加手動釋放池
主線程的runloop是默認開啓的,如果想開啓子線程的runloop[ [NSRunloop currentRunloop] run],但是子線程開啓runloop後不會被銷燬
[NSThread sleepForTimeInterval:10];這是讓你的線程休眠
我們可以通過NSLog(@“%d”,[NSThread isMainThread])可以判斷是不是主線程
我們可以通過NSLog(@“%@“,[NSThread mainThread])獲得主線程是什麼
我們可以\通過NSLog(@“%@“,[NSThread currentThread])獲得執行線程是誰
NSInvocationOperation + NSOperationQueue
NSInvocationOperation * operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(要做的事情) object:nil];
NSOperationQueue * queue = [[NSOperationQueue alloc] init];//他會自動創建一個子線程去做事情
[queue addOperation:operation];
[operation release];
[queue release];
NSBlockOperation + NSOperationQueue  (這個和上面的可以加到一起)有一個[queue setMaxConcurrentOperationCunt:數字]這是你最多可以幾個子線程
NSBlockOperation * operation = [NSBlockOperation blockOperationWithBlock:^{
     [self  要做的事情];
}];
NSOperationQueue * queue = [[NSOperationQueue alloc] init];
[queue addOperation:operation];
[queue release];
NSObject多線程
[self performSelectorInBackGround:@selector(子線程要做的事情) withObject:   ..]
[self performSelectorOnMainThread:@selector(主線程要做的事情) withObject:…];
     GCD
在GCD中的幾個概念
GCD提供分派隊列dispatch queue,管理和分派任務,先進入的先執行
隊列分爲三種類型
主隊列 : 任務執行的線程是在主線程裏執行的,是串行的分派任務的方式;
串行的含義:必須是前一個任務執行完成在執行下一個任務
全局隊列 : 任務的執行是在子線程執行的,並且是並行的分派任務的方式
並行的含義:每個任務是按順序派發的,但是新的任務不需要等前一個任務完成,如果沒有子線程就創建一個子線程,期間有空餘的就派發到空的子線程
自定義隊列(自己創建的隊列) : 任務的執行是在子線程的,可以是並行的也可以是串行的分派任務的方式
全局隊列代碼演示
獲取全局隊列     這個任務是由全局隊列創建子線程開始執行的
dispatch_queue_t situationQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_async(situationQueue,^{
NSLog(@“%d”,[NSThread isMainThread]);這裏的返回值是0就是在子線程,返回是1就是在主線程;
這個block執行的時候是在子線程
建立異步鏈接下載圖片
NSString * urlString = @“圖片的地址”
NSURL * url = [NSURL URLWithString:urlString];
NSData * data = [NSData dataWithContentsOfURL:url];這是得到了這個圖片的NSData數據流
圖片獲取成功之後,需要將圖片顯示在UI上(這個任務必須食雜主線程上完成的);
找準主隊列添加顯示任務
dispatch_async(dispatch_get_main_queue(),^){
UIImage * image = [UIImage imageWithData:data];
UIImageView * imageView = [[UIImage View alloc] initWithImage:image];
imageView.frame = CGRectMake();
[self.view addSubview:imageView];
[imageView release];
});
});
自定義隊列的代碼演示(並行模式)
創建queue設置爲並行派發任務模式
dispatch_get_t myConcurrentQueue = dispatch_queue_create(“”,DISPATCH_QUEUE_CONCRRENT);//因爲這裏創建了
dispatch_async(myConcurrentQueue,^{…..});
記得release    dispatch_release(myConcurrentQueue);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章