GCD(2)
2015-10-16 05:08 真实16 阅读(482) 评论(0) 编辑 收藏 举报//
// ViewController.m
// UI-NO.26-GCD
//
// Created by Bruce on 15/8/27.
// Copyright (c) 2015年 Bruce. All rights reserved.
//
/*
Grand Central Dispatch (GCD)是苹果比较提倡的一个多核编程的解决方法
GCD底层也是用线程来实现,指示苹果帮咱们封装了具体操作的方法,这样可以让程序员不用关注实现的细节,只需要专注功能的实现
GCD参数 queue:队列 block:任务
GCD 有两种执行任务的方式 1、同步dispatch_sync(避免在主队列中使用同步执行主线程任务 容易 死锁) 2、异步dispatch_async
同步和异步的区别:
同步:在当前线程中执行
异步:在另一条线程中执行
GCD执行多个任务的<队列>方式 也有两种:
1、串行队列:让任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务)
2、并发队列:可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)并发功能只有在异步(dispatch_async)函数下才有效
串行队列又分为两种:
1、主队列 dispatch_get_main_queue() 主队列是GCD自带的一种特殊的串行队列,放在主队列中的任务,都会放到主线程中执行
2、创建一个队列 dispatch_queue_create
并发队列:GCD默认已经提供了全局的并发队列,供整个应用使用,不需要手动创建
dispatch_get_global_queue
里面第一个参数是设置他的优先级
#define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默认(中)
#define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台
GCD延迟提交任务
// when:所指定的时间
// queue:指定的队列
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"延迟提交任务");
});
// GCD 将任务分组
// 有时候,我们可能执行一系列的任务。由于彼此之间的依赖关系。比如有3个任务:A、B、C;我们必须执行了任务A,才能执行任务B,最后执行任务C。这样的话,我们可以用GCD的分组机制来将多个任务来按照预定的顺序来执行
// 创建一个组
dispatch_group_t creatGroup = dispatch_group_create();
// 创建一个队列
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_group_async(creatGroup, queue, ^{
NSLog(@"%@",[NSThread currentThread]);
});
dispatch_group_async(creatGroup, queue, ^{
NSLog(@"%@",[NSThread currentThread]);
});
dispatch_group_async(creatGroup, queue, ^{
NSLog(@"%@",[NSThread currentThread]);
});
dispatch_group_notify(creatGroup, queue, ^{
NSLog(@"成功");
});
*/
#import "ViewController.h"
@interface ViewController ()<UITableViewDelegate,UITableViewDataSource>
{
UITableView *myTableView;
UIImage *showImage;
NSArray *urlList;
NSMutableDictionary *imageDic;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
imageDic = [NSMutableDictionary dictionary];
// 串行队列:
// 得到主队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
// 创建一个队列
dispatch_queue_t createQueue = dispatch_queue_create("create", NULL);
// NSLog(@"....");
// 同步用于串行队列:主线程在等待着主队列调度同步任务,而主队列发现主线程上还有任务未执行完,就不会让同步任务添加到主线程上,由此就造成了互相等待,就会造成死锁
// dispatch_sync(mainQueue, ^{
// NSLog(@"1111");
// });
// viewDidLoad 在主线程中,执行到sync 时 向 dispatch_get_main_queue()插入 同步 操作
// sync 会等到 后面block 执行完成才返回, sync 又再 dispatch_get_main_queue() 队列中,
// 它是串行队列,sync 是后加入的,前一个是主线程,
// 所以 sync 想执行 block 必须等待主线程执行完成,主线程等待 sync 返回,去执行后续内容。
//造成死锁,sync 等待mainThread 执行完成, mianThread 等待sync 函数返回。
// 异步
// dispatch_async(mainQueue, ^{
// NSLog(@"1111");
// });
// dispatch_sync(createQueue, ^{
// NSLog(@"1111");
// });
// dispatch_sync(createQueue, ^{
// NSLog(@"2222");
// });
// dispatch_sync(createQueue, ^{
// NSLog(@"3333");
// });
// dispatch_async(createQueue, ^{
// NSLog(@"1111");
// });
// dispatch_async(createQueue, ^{
// NSLog(@"2222");
// });
// dispatch_async(createQueue, ^{
// NSLog(@"3333");
// });
// 并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
dispatch_queue_t queue1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_queue_t queue2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
// 并发队列 只在异步的情况下有效
// dispatch_async(queue, ^{
// NSLog(@"111");
// });
// dispatch_async(queue1, ^{
// NSLog(@"1111");
// });
// dispatch_async(queue2, ^{
// NSLog(@"11111");
// });
dispatch_group_t group = dispatch_group_create();
dispatch_sync(queue, ^{
NSLog(@"1...");
});
dispatch_sync(queue, ^{
NSLog(@"2...");
});
dispatch_sync(queue, ^{
NSLog(@"3...");
});
dispatch_group_notify(group, queue, ^{
NSLog(@"ok...");
});
dispatch_group_t group1 = dispatch_group_create();
dispatch_sync(queue1, ^{
NSLog(@"1...1");
});
dispatch_sync(queue1, ^{
NSLog(@"2...1");
});
dispatch_sync(queue1, ^{
NSLog(@"3...1");
});
dispatch_group_notify(group1, queue1, ^{
NSLog(@"ok...1");
});
urlList = @[@"http://image.tianjimedia.com/uploadImages/2012/273/M6J97CZGYA4Z_NatGeo01_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/J3ME8ZNAG315_NatGeo02_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/EL9230AP5196_NatGeo03_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/SYJ43SG47PC8_NatGeo04_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/605X52620G0M_NatGeo05_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/7H5RQ1ELP8MZ_NatGeo06_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/Z2W429E0203R_NatGeo07_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/BG011W9LWL77_NatGeo08_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/936FM8NN22J2_NatGeo09_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/H79633PPEFZW_NatGeo10_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/54Z01YZ78050_NatGeo11_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/61V3658UA4IY_NatGeo12_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/H3HL7YILNGKB_NatGeo13_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/1V6797311ZA5_NatGeo14_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/93L81IKN156R_NatGeo15_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/V93E1EGU2G0Z_NatGeo16_250.jpg", @"http://image.tianjimedia.com/uploadImages/2012/273/QC205CD96IWZ_NatGeo17_250.jpg"];
myTableView = [[UITableView alloc]initWithFrame:self.view.frame];
myTableView.delegate = self;
myTableView.dataSource = self;
[self.view addSubview:myTableView];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(!cell){
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
__block UIImage *images = [imageDic objectForKey:@(indexPath.row)];
if (!images) {
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSURL *url = [NSURL URLWithString:urlList[indexPath.row]];
NSURLRequest * request = [NSURLRequest requestWithURL:url];
NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
if (data) {
images = [UIImage imageWithData:data];
[imageDic setObject:images forKey:@(indexPath.row)];
}
//下载完成后转到主线程更新表格cell
dispatch_async(dispatch_get_main_queue(), ^{
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
});
});
}
cell.imageView.image = images;
return cell;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return urlList.count;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 100;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end