GCD下怎么样实现同步操作?这里有四种思路。
第一串行队列,第二并行队列,第三分组,第四信号量。
GCD下的dispatch_queue队列都是FIFO队列,就是按照提交到队列中的顺序执行,那这里分串行队列和并行队列是什么情况呢?串行队列是提交到队列里的任务按照提交的顺序执行,并且是执行完了上一个任务后再执行下一个任务;并行队列同样按照提交的顺序执行,不过不想串行队列一个任务执行完了后再执行下一个任务,而是可以以任何顺序执行。串行队列只开一个线程,并行队列开启多个线程同时执行任务。
--------------------------------------
常见的实例:去网上获取一张图片,然后展示在视图上。分成两步先去下载图片,然后显示在视图上,这两步是同步的。
一.串行队列
把这两个任务先后提交到一个串行队列里。
// 创建一个串形队列
dispatch_queue_t serilQueue = dispatch_queue_create("com.quains.myQueue", 0);
// 开始时间
NSDate *startTime = [NSDate date];
__block UIImage *image = nil;
// 1.先去网上下载图片
dispatch_async(serilQueue, ^{
NSString *urlAsString = @"xxx";
NSURL *url = [NSURL URLWithString:urlAsString];
NSError *downloadError = nil;
NSData *imageData = [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:url] returningResponse:nil error:&downloadError];
if (downloadError == nil && imageData != nil) {
image = [[UIImage imageWithData:imageData] retain];
}
else if(downloadError != nil){
NSLog(@"error happened = %@", downloadError);
}
else {
NSLog(@"No data download");
}
});
// 2.在主线程展示到界面里
dispatch_async(serilQueue, ^{
NSLog(@"当前线程:%@",[NSThread currentThread]);
// 界面元素一般在主线程展示
dispatch_async(dispatch_get_main_queue(), ^{
if (image != nil) {
UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
[imageView setImage:image];
[imageView setContentMode:UIViewContent