GCD 常用代码

异步执行任务

- (void)gcdDemo1 {

// 1. 全局队列dispatch_queue_tq = dispatch_get_global_queue(0,0);

// 2. 任务void(^task)() = ^ {NSLog(@"%@", [NSThreadcurrentThread]);  

  };

// 3. 指定执行任务的函数// 异步执行任务 - 新建线程,在新线程执行task

dispatch_async(q, task);NSLog(@"come here");}

注意:如果等待时间长一些,会发现线程的number发生变化,由此可以推断gcd 底层线程池的工作

同步执行任务

- (void)gcdDemo1 {

// 1. 全局队列dispatch_queue_tq = dispatch_get_global_queue(0,0);

// 2. 任务void(^task)() = ^ {NSLog(@"%@", [NSThreadcurrentThread]);    

};

// 3. 指定执行任务的函数

// 同步执行任务 - 不开启线程,在当前线程执行 task

dispatch_sync(q, task);

NSLog(@"come here");

}

精简代码

- (void)gcdDemo2 {for(inti =0; i <10; ++i){dispatch_async(dispatch_get_global_queue(0,0), ^{

NSLog(@"%@ %@", [NSThreadcurrentThread],@"hello"); 

       });  

  }

}

与NSThread的对比

所有的代码写在一起的,让代码更加简单,易于阅读和维护

NSThread通过@selector指定要执行的方法,代码分散

GCD通过block指定要执行的代码,代码集中

使用GCD不需要管理线程的创建/销毁/复用的过程!程序员不用关心线程的生命周期

如果要开多个线程NSThread必须实例化多个线程对象

NSThread靠NSObject的分类方法实现的线程间通讯,GCD靠block

线程间通讯

- (void)gcdDemo3 {dispatch_async(dispatch_get_global_queue(0,0), ^{

NSLog(@"耗时操作 %@", [NSThreadcurrentThread]);

// 耗时操作之后,更新

UIdispatch_async(dispatch_get_main_queue(), ^{

NSLog(@"更新 UI %@", [NSThreadcurrentThread]); 

       });   

 });

}

以上代码是GCD最常用代码组合!

如果要在更新 UI 之后,继续做些事情,可以使用以下代码

- (void)gcdDemo4 {dispatch_async(dispatch_get_global_queue(0,0), ^{

NSLog(@"耗时操作");

dispatch_sync(dispatch_get_main_queue(), ^{

NSLog(@"更新UI"); 

 });

NSLog(@"更新UI完毕"); 

   });

}

网络下载图片

- (void)viewDidLoad {    

[superviewDidLoad];

dispatch_async(dispatch_get_global_queue(0,0), ^{

NSLog(@"%s %@", __FUNCTION__, [NSThreadcurrentThread]);

// 1. 异步下载网络图片NSURL*url = [NSURLURLWithString:@"http://f.hiphotos.baidu.com/image/pic/item/1f178a82b9014a901bef674aaa773912b21bee70.jpg"];

NSData*data = [NSDatadataWithContentsOfURL:url];UIImage*image = [UIImageimageWithData:data];

// 2. 完成后更新 UIdispatch_async(dispatch_get_main_queue(),^{

self.imageView.image= image;   

 [self.imageViewsizeToFit];

self.scrollView.contentSize= image.size; 

});

});

}

你可能感兴趣的:(GCD 常用代码)