1.线程间通讯
{
//1.开子线程下载图片
//创建队列(并发)
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//异步函数
dispatch_async(queue, ^{
//1.获取url地址
NSURL *url = [NSURL URLWithString:@"imageUrl"];
//2.下载图片
NSData *data = [NSData dataWithContentsOfURL:url];
//3.把二进制数据转换成图片
UIImage *image = [UIImage imageWithData:data];
NSLog(@"----%@",[NSThread currentThread]);
dispatch_sync(dispatch_get_main_queue(), ^{
self.imageView.image = image;
NSLog(@"+++%@",[NSThread currentThread]);
});
});
}
2.队列组
-(void)group
{
//下载图片1
//创建队列组
dispatch_group_t group = dispatch_group_create();
//1.开子线程下载图片
//创建队列(并发)
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_group_async(group, queue, ^{
//1.获取url地址
NSURL *url = [NSURL URLWithString:@"http://www.huabian.com/uploadfile/2015/0914/20150914014032274.jpg"];
//2.下载图片
NSData *data = [NSData dataWithContentsOfURL:url];
//3.把二进制数据转换成图片
self.image1 = [UIImage imageWithData:data];
NSLog(@"1---%@",self.image1);
});
//下载图片2
dispatch_group_async(group, queue, ^{
//1.获取url地址
NSURL *url = [NSURL URLWithString:@"http://img1.3lian.com/img2011/w12/1202/19/d/88.jpg"];
//2.下载图片
NSData *data = [NSData dataWithContentsOfURL:url];
//3.把二进制数据转换成图片
self.image2 = [UIImage imageWithData:data];
NSLog(@"2---%@",self.image2);
});
//合成
dispatch_group_notify(group, queue, ^{
//开启图形上下文
UIGraphicsBeginImageContext(CGSizeMake(200, 200));
//画1
[self.image1 drawInRect:CGRectMake(0, 0, 200, 100)];
//画2
[self.image2 drawInRect:CGRectMake(0, 100, 200, 100)];
//根据图形上下文拿到图片
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
//关闭上下文
UIGraphicsEndImageContext();
dispatch_async(dispatch_get_main_queue(), ^{
self.imageView.image = image;
NSLog(@"%@--刷新UI",[NSThread currentThread]);
});
});
}
3.dispatch_apply
-(void)applay
{
// for (NSInteger i=0; i<10; i++) {
// NSLog(@"%zd--%@",i,[NSThread currentThread]);
// }
//创建队列(并发队列)
dispatch_queue_t queue = dispatch_queue_create("com.downloadqueue", DISPATCH_QUEUE_CONCURRENT);
/*
第一个参数:迭代的次数
第二个参数:在哪个队列中执行
第三个参数:block要执行的任务
*/
dispatch_apply(10, queue, ^(size_t index) {
NSLog(@"%zd--%@",index,[NSThread currentThread]);
});
}
4.delay
-(void)delay
{
NSLog(@"----");
//表名2秒钟之后调用run
// [self performSelector:@selector(run) withObject:nil afterDelay:2.0];
// [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
/*
第一个参数:延迟时间
第二个参数:要执行的代码
*/
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_global_queue(0, 0), ^{
NSLog(@"---%@",[NSThread currentThread]);
});
}
5.单例
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"+++++++++");
});
}
6.栅栏函数
-(void)barrier
{
//1.创建队列(并发队列)
dispatch_queue_t queue = dispatch_queue_create("com.downloadqueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
for (NSInteger i = 0; i<10; i++) {
NSLog(@"%zd-download1--%@",i,[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (NSInteger i = 0; i<10; i++) {
NSLog(@"%zd-download2--%@",i,[NSThread currentThread]);
}
});
//栅栏函数
dispatch_barrier_async(queue, ^{
NSLog(@"我是一个栅栏函数");
});
dispatch_async(queue, ^{
for (NSInteger i = 0; i<10; i++) {
NSLog(@"%zd-download3--%@",i,[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (NSInteger i = 0; i<10; i++) {
NSLog(@"%zd-download4--%@",i,[NSThread currentThread]);
}
});
}