在ios中,使用多線程有三種方式,分別是:NSThread、NSOperation和NSOperationQueue、GCD,在本節,主要講解一下CDD的使用。 GCD(Grand Central Dispatch) ,他是基於C語言開發的一套多線程開發機制,也是目前蘋果官方推薦的多線程開發方...
在ios中,使用多線程有三種方式,分別是:NSThread、NSOperation和NSOperationQueue、GCD,在本節,主要講解一下CDD的使用。
GCD(Grand Central Dispatch) ,他是基於C語言開發的一套多線程開發機制,也是目前蘋果官方推薦的多線程開發方法。GCD的抽象層次最高,用起來比較簡單,但是因為它是基於C語言開發的,是面向過程的,所以在使用的時候不如面向對象的好理解。但是GCD這種機制相比較於前面兩種多線程開發方式最顯著的優點就是它對於多核運算更加有效。
GCD隊列
GCD中也有一個類似於NSOperationQueue的隊列,GCD統一管理整個隊列中的任務,GCD中的隊列分為三種:
(1) 串列隊列 dispatch_queue_create(, ):只有一個線程,加入到隊列中的操作按添加順序依次執行。
(2) 全局隊列dispatch_get_global_queue(,):有多個線程,操作進來之後它會將這些隊列安排在可用的處理器上,同時保證先進來的任務優先處理。
(3) 主隊列 dispatch_get_main_queue():用來執行主線程上的操作任務。
GCD使用
從網路載入圖片會使用多線程的方式,在這裡,使用GCD的方式從網路獲取圖片。
使用GCD取數據的時候有同步dispatch_sync(,)和非同步dispatch_async(,)兩種方式,一般會選擇使用非同步的方式請求數據。
此外,如果是一組圖片,可以選擇使用串列隊列請求顯示,也就是按照順序依次顯示;還可以使用全局隊列請求顯示,顯示的時候是非同步併發,不按順序隨機顯示。在下麵的代碼中,分別介紹一下兩種方式。
代碼
// ViewController.m // GCD_Demo // // Created by jerei on 15-11-13. // Copyright (c) 2015年 jerehedu. All rights reserved. // #import "ViewController.h" #define IMG_VIEW_WIDTH 90 #define IMG_VIEW_HEIGHT 45 #define GAP (([UIScreen mainScreen].bounds.size.width - (2*IMG_VIEW_WIDTH))/3.0) @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //設置界面上顯示圖片的imageView [self addImageViews]; //加按鈕 [self addBtns]; } #pragma mark - 設置界面上顯示圖片的imageView -(void)addImageViews{ for (int i=0; i<10; i++) { UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(GAP+(i%2)*(IMG_VIEW_WIDTH+GAP), 60 + GAP + (i/2)*(IMG_VIEW_HEIGHT+20), IMG_VIEW_WIDTH, IMG_VIEW_HEIGHT)]; imgView.tag = i+1; imgView.backgroundColor = [UIColor redColor]; [self.view addSubview:imgView]; } } #pragma mark - 按鈕 -(void)addBtns{ UIButton *serial_btn = [[UIButton alloc] initWithFrame:CGRectMake(GAP, 30, IMG_VIEW_WIDTH, IMG_VIEW_HEIGHT)]; [serial_btn setTitle:@"串列載入" forState:UIControlStateNormal]; [serial_btn setBackgroundColor:[UIColor purpleColor]]; [self.view addSubview:serial_btn]; [serial_btn addTarget:self action:@selector(loadImage_gcd_serial) forControlEvents:UIControlEventTouchUpInside]; UIButton *global_btn = [[UIButton alloc] initWithFrame:CGRectMake(2*GAP+IMG_VIEW_WIDTH, 30, IMG_VIEW_WIDTH, IMG_VIEW_HEIGHT)]; [global_btn setTitle:@"並行載入" forState:UIControlStateNormal]; [global_btn setBackgroundColor:[UIColor purpleColor]]; [self.view addSubview:global_btn]; [global_btn addTarget:self action:@selector(loadImage_gcd_global) forControlEvents:UIControlEventTouchUpInside]; } #pragma mark - 從網路串列載入照片 -(void)loadImage_gcd_serial{ //串列隊列 dispatch_queue_t serialQueue = dispatch_queue_create("myThreadQueue1", DISPATCH_QUEUE_SERIAL); //請求圖片 for (int i=0; i<10; i++) { dispatch_async(serialQueue, ^{ //從網路獲取圖片 NSURL *url = [NSURL URLWithString:@"http://www.jerehedu.com/images/temp/logo.gif"]; NSData *data = [NSData dataWithContentsOfURL:url]; UIImage *image = [UIImage imageWithData:data]; //回到主線程刷新界面 dispatch_sync(dispatch_get_main_queue(), ^{ UIImageView *currentImgView = (UIImageView *)[self.view viewWithTag:i+1]; currentImgView.image = image; }); }); } } #pragma mark - 從網路並行載入照片 -(void)loadImage_gcd_global{ //並行隊列 dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //請求圖片 for (int i=0; i<10; i++) { dispatch_async(globalQueue, ^{ //從網路獲取圖片 NSURL *url = [NSURL URLWithString:@"http://www.jerehedu.com/images/temp/logo.gif"]; NSData *data = [NSData dataWithContentsOfURL:url]; UIImage *image = [UIImage imageWithData:data]; //回到主線程刷新界面 dispatch_sync(dispatch_get_main_queue(), ^{ UIImageView *currentImgView = (UIImageView *)[self.view viewWithTag:i+1]; currentImgView.image = image; }); }); } } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } @end
作者:傑瑞教育
出處:http://www.cnblogs.com/jerehedu/
版權聲明:本文版權歸煙台傑瑞教育科技有限公司和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
技術咨詢: