1.GCD线程之间的通信
- 使用异步函数+除了主队列之外的队列创建子线程,在子线程中执行下载操作(耗时操作)
- 在子线程中添加任务到主队列(更新UI操作),同步异步都可
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_async(queue, ^{
NSURL *url = [NSURL URLWithString:@"http://pic.4j4j.cn/upload/pic/20130531/07ed5ea485.jpg"];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];
dispatch_sync(dispatch_get_main_queue(), ^{
self.iv.image = image;
});
NSLog(@"设置图片完毕 %@", image);
});
}
2.延时操作
[NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(demo) userInfo:nil repeats:NO];
-(void)demo{
NSLog(@"延时操作");
}
[self performSelector:@selector(demo) withObject:nil afterDelay:3.0];
-(void)demo{
NSLog(@"延时操作");
}
-(void)delayGCD{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"3秒后执行 %@",[NSThread currentThread]);
});
}
3.一次性代码
- 注意,一次性代码永远只执行一次
- 一次性代码和懒加载不能混用,懒加载在需要的时候被创建,销毁后,再次加载仍然会重新创建,而一次性代码在整个程序过程中只会被执行一次
- 通常一次性代码可以用来创建单例对象
-(void)onceTakon{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"一次性代码");
});
}
4.快速迭代
- 使用dispatch_apply函数能进行快速迭代遍历
- 使用快速迭代要比for循环遍历效率要高
-(void)apply{
NSString *sourceFile = @"/Users/liuzhouji/Desktop/abc";
NSString *resultFile = @"/Users/liuzhouji/Desktop/zj";
NSFileManager *manager = [NSFileManager defaultManager];
NSArray *files = [manager subpathsAtPath:sourceFile];
dispatch_apply(files.count, dispatch_get_global_queue(0, 0), ^(size_t idx) {
NSString *fileName = files[idx];
NSString *sourcePath = [sourceFile stringByAppendingPathComponent:fileName];
NSString *desPath = [resultFile stringByAppendingPathComponent:fileName];
[manager moveItemAtPath:sourcePath toPath:desPath error:nil];
});
}
5.栅栏
- 功能:
- 1.拦截前面的任务, 只有先添加到队列中的任务=执行完毕, 才会执行栅栏添加的任务
- 2.如果栅栏后面还有其它的任务,那么必须等栅栏执行完毕才会执行后面的其它任务
- 注意点:
- 1.如果想要使用栅栏, 那么就不能使用全局的并发队列
- 2.如果想使用栅栏,那么所有的任务都必须添加到同一个队列中
- (void)barrier
{
dispatch_queue_t queue = dispatch_queue_create("zj.queue", DISPATCH_QUEUE_CONCURRENT);
__block UIImage *image1 = nil;
__block UIImage *image2 = nil;
dispatch_async(queue, ^{
NSURL *url = [NSURL URLWithString:@"http://h.hiphotos.baidu.com/image/pic/item/77c6a7efce1b9d1632701663f5deb48f8c546479.jpg"];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];
image1 = image;
NSLog(@"图片1下载完毕");
});
dispatch_async(queue, ^{
NSURL *url = [NSURL URLWithString:@"http://f.hiphotos.baidu.com/image/pic/item/18d8bc3eb13533fa0f2eb8c0acd3fd1f40345b47.jpg"];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];
image2 = image;
NSLog(@"图片2下载完毕");
});
dispatch_barrier_async(queue, ^{
NSLog(@"%@ %@", image1, image2);
UIGraphicsBeginImageContext(CGSizeMake(200, 200));
[image1 drawInRect:CGRectMake(0, 0, 100, 200)];
[image2 drawInRect:CGRectMake(100, 0, 100, 200)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
dispatch_async(dispatch_get_main_queue(), ^{
self.iv.image = newImage;
[UIImagePNGRepresentation(newImage) writeToFile:@"/Users/xiaomage/Desktop/abc/123.png" atomically:YES];
});
NSLog(@"栅栏执行完毕了");
});
dispatch_async(queue, ^{
NSLog(@"1---------");
});
dispatch_async(queue, ^{
NSLog(@"2---------");
});
dispatch_async(queue, ^{
NSLog(@"3---------");
});
}
6.队列组
- 利用队列组可以实现和栅栏类似的效果
- 可以让耗时操作执行完后再去执行更新UI的操作
-(void)group{
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_group_t group = dispatch_group_create();
__block UIImage *image1 = nil;
__block UIImage *image2 = nil;
dispatch_group_async(group, queue, ^{
NSURL *url = [NSURL URLWithString:@"http://h.hiphotos.baidu.com/image/pic/item/77c6a7efce1b9d1632701663f5deb48f8c546479.jpg"];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];
image1 = image;
NSLog(@"图片1下载完毕");
});
dispatch_group_async(group, queue, ^{
NSURL *url = [NSURL URLWithString:@"http://f.hiphotos.baidu.com/image/pic/item/18d8bc3eb13533fa0f2eb8c0acd3fd1f40345b47.jpg"];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];
image2 = image;
NSLog(@"图片2下载完毕");
});
dispatch_group_notify(group, queue, ^{
NSLog(@"%@ %@", image1, image2);
UIGraphicsBeginImageContext(CGSizeMake(200, 200));
[image1 drawInRect:CGRectMake(0, 0, 100, 200)];
[image2 drawInRect:CGRectMake(100, 0, 100, 200)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
dispatch_async(dispatch_get_main_queue(), ^{
self.iv.image = newImage;
[UIImagePNGRepresentation(newImage) writeToFile:@"/Users/xiaomage/Desktop/abc/123.png" atomically:YES];
});
});
}