//你可以先看看这个例子的效果找点感觉,再看说明
@interface yxpGCDVController ()
{
UIImageView *_imageView;
}
@end
@implementation yxpGCDVController
- (void)viewDidLoad
{
[super viewDidLoad];
self.title=@"GCD";
//初始化一_ImageView
_imageView=[[UIImageView alloc] initWithFrame:CGRectMake(10, 70, 300, 450)];
_imageView.backgroundColor=[UIColor grayColor];
_imageView.animationDuration=3.0;
_imageView.animationRepeatCount=0;
[self.view addSubview:_imageView];
//在后台异步执行队列
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *url1=@"http://h.hiphotos.baidu.com/image/w%3D230/sign=b2d5c289123853438ccf8022a311b01f/91ef76c6a7efce1b1ae9f92fad51f3deb58f6510.jpg";
NSString *url2=@"http://h.hiphotos.baidu.com/image/pic/item/d058ccbf6c81800aae834e8bb33533fa838b47d5.jpg";
NSString *url3=@"http://d.hiphotos.baidu.com/image/pic/item/f2deb48f8c5494eec3ba65132ff5e0fe99257e1b.jpg";
NSString *url4=@"http://g.hiphotos.baidu.com/image/pic/item/a6efce1b9d16fdfa81f4ace4b68f8c5494ee7b1b.jpg";
NSString *url5=@"http://g.hiphotos.baidu.com/image/pic/item/d6ca7bcb0a46f21f70031fdbf4246b600c33ae07.jpg";
NSArray *array=[[NSArray alloc] initWithObjects:url1,url2,url3,url4,url5, nil];
NSMutableArray *imageArray=[[NSMutableArray alloc] initWithCapacity:20];
for (NSString *string in array) {
//下载图片
NSLog(@"执行图片下载函数");
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:string]];
UIImage *image = [UIImage imageWithData:data];
[imageArray addObject:image];
}
_imageView.animationImages=imageArray;
//回到主线程执行方法
dispatch_async(dispatch_get_main_queue(), ^{
[_imageView startAnimating];
});
});
}
@end
//GCD 的使用方式
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
async表明运行方式
queue则是你把任务交给那个线程队列来处理
block代表的是你要做的事情
//线程运行方式
dispatch_async 异步执行
dispatch_sync 同步执行
dispatch_delay 延迟执行
...
//处理任务对象 dispatch queue(线程队列)
一、dispatch_get_main_queue 主线程队列(UI线程队列)
二、dispatch_get_global_queue 并行线程队列,由系统创建三个不同优先级的dispatch queue。并行队列的执行顺序与其加入队列的顺序相同。
三、串行队列,一般用于按顺序同步访问,依次执行(顺序由代码先后觉得),可创建任意数量的串行队列,各个串行队列之间是并发的。
当想要任务按照某一个特定的顺序执行时,串行队列是很有用的。串行队列在同一个时间只执行一个任务。我们可以使用串行队列代替锁去保护共享的数据。和锁不同,一个串行队列可以保证任务在一个可预知的顺序下执行。
串行队列通过dispatch_queue_create创建,可以使用函数dispatch_retain和dispatch_release去增加或者减少引用计数。
//dispatch queue叫线程队列
dispatch_queue_create 用于创建用户线程队列。可以创建Serial/Concurrent Dispatch Queue 两种队列,即串行与并行队列。
一、创建Serial Dispatch Queue。
dispatch_queue_t serialQueue =dispatch_queue_create("com.SerialQueue", NULL);
可以创建多个串行队列,串行队列也可以并行执行。决不能随意的大量生产Serial Dispatch Queue。
二、创建Concurrent Dispatch Queue
dispatch_queue_t concurrentQueue =dispatch_queue_create("com.ConcurrentQueue",
DISPATCH_QUEUE_CONCURRENT);
Concurrent Dispatch Queue不过创建多少都没有问题,因为Concurrent Dispatch Queue所使用的线程由系统的XNU内核高效管理,不会影响系统性能。
// 只执行一次的线程 一般用来写单例模式
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
});
EG:
static SubObject *subobject = nil;
+ (SubObject *)sharedRequest
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
subobject = [[SubObject alloc]init];
});
return subobject;
}
// 延迟2秒执行线程
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
// code to be executed on the main queue after delay
});
//线程汇总通知,等所有子线程(这个称呼不准确,先代替了)执行完成后,才执行notify线程
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
// 并行执行的线程一
for (int i=0; i<10; i++) {
NSLog(@"---------%i",i);
}
});
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
// 并行执行的线程二
for (int i=10; i<20; i++) {
NSLog(@"+++++++++%i",i);
}
});
dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{
// 汇总结果
NSLog(@"完成");
});