gcd 分为并行,串行两种方式,任务的执行可分为,同步,异步执行方式。
dispatch_queue_tqueue =dispatch_queue_create("queue",DISPATCH_QUEUE_SERIAL);//这是一个串行队列。
dispatch_queue_tQueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);//这是一个并行队列。
dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>);//这是异步方式
dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>);//这是同步方式
创建线程及更新UI的步骤如下:
/*
1、创建视图
2、创建一个串行队列
3、用异步方式执行串行队列中的任务
4、加载网络资源
5、回到主线程
6、更新UI
*/
1示例:
//1、创建视图
UIImageView *imageView= [[UIImageView alloc]initWithFrame:CGRectMake(50,50,200,200)];
imageView.backgroundColor= [UIColor cyanColor];
[self.viewaddSubview:myImageView];
//2、找到串行队列
dispatch_queue_tserialQueue =dispatch_queue_create("serialQueue",DISPATCH_QUEUE_SERIAL);
//3、用异步方式执行任务
dispatch_async(serialQueue, ^{
//4、加载网络资源
NSData*data = [NSDatadataWithContentsOfURL:[NSURLURLWithString:url]];//图片的url
UIImage*image = [UIImageimageWithData:data];
//5、回到主线程
//找到主队列:dispatch_get_main_queue()
dispatch_queue_tmainQueue =dispatch_get_main_queue();
dispatch_sync(mainQueue, ^{
//6、更新UI
imageView.image= image;
});
});
2 实例:
//1、创建多个视图
for(inti=0; i<3; i++) {
for(intj=0; j<2; j++) {
UIImageView *imageView= [[UIImageView alloc]initWithFrame:CGRectMake(10+j*100,40+i*100,90,90)];
imageView.backgroundColor= [UIColor orangeColor];
imageView.tag=imageTag++;//imageTag上设置成全局变量,其初始值是100
[self.viewaddSubview:imageView];
}
}
2//并行
dispatch_queue_tQueue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
3//创建组
dispatch_group_tGroup =dispatch_group_create();
4//将并行任务放入到组中
dispatch_group_async(Group,Queue, ^{
for(intindex =0; index<6; index++) {
NSData*data = [NSData dataWithContentsOfURL:[NSURLURLWithString:url]];//放入你的图片的url
UIImage*image = [UIImageimageWithData:data];
[arraymutable addObject:image];//创建一个可变数组用于接受生成的image对象,注意不要忘记初始化数组
}
});
5//所有组都完成后执行
dispatch_group_notify(Group, Queue, ^{
6//回到主线程
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@",arraymutable);
for(inti=0; i<6; i++) {
UIImageView*iamgeview = [self.viewviewWithTag:100+i];
iamgeview.image=arraymutable[i];//将数组中的image对象赋值
}
});
});
先写这两个方法。