/*
GCD会自动根据任务在多核处理器上分配资源,优化程序。
*/
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSURL * url = [NSURL URLWithString:@"http://c.hiphotos.baidu.com/image/w%3D2048/sign=27c299329058d109c4e3aeb2e560cdbf/b812c8fcc3cec3fd06955d39d488d43f869427d7.jpg"];
NSData * data = [[NSData alloc]initWithContentsOfURL:url];
UIImage *image = [[UIImage alloc]initWithData:data];
if (data != nil) {
dispatch_async(dispatch_get_main_queue(), ^{
self.imageView.image = image;
});
}
});
/*dispatch_group_async的使用
dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。
这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了。
下面是一段例子代
*/
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
/*
dispatch_group_async(<#dispatch_group_t group#>, <#dispatch_queue_t queue#>, <#^(void)block#>)
*/
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:1];
NSLog(@"group1");
});
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"group2");
});
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:3];
NSURL * url = [NSURL URLWithString:@"http://a.hiphotos.baidu.com/image/w%3D2048/sign=640abed35cdf8db1bc2e7b643d1bdc54/9e3df8dcd100baa1f57bf8f04510b912c8fc2e21.jpg"];
NSData * data = [[NSData alloc]initWithContentsOfURL:url];
image2 = [[UIImage alloc]initWithData:data];
NSLog(@"group3");
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
self.imageView.image = image2;
});
//释放Group
dispatch_release(group);
/*
dispatch_barrier_async的使用
dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行
例子代码如下:
*/
dispatch_queue_t queue2 = dispatch_queue_create("gcdtest.rongfzh.yc", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue2, ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"dispatch_async1");
});
dispatch_async(queue2, ^{
[NSThread sleepForTimeInterval:4];
NSLog(@"dispatch_async2");
});
dispatch_barrier_async(queue2, ^{
NSLog(@"dispatch_barrier_async");
[NSThread sleepForTimeInterval:4];
});
dispatch_async(queue2, ^{
[NSThread sleepForTimeInterval:1];
NSLog(@"dispatch_async3");
});
/*
dispatch_apply
执行某个代码片段N次
*/
dispatch_queue_t queue3 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply(10, queue3, ^(size_t i){
NSLog(@"哈哈");
});