GCD的其他方法

Posted on 2016-07-16 23:00  柠檬片  阅读(138)  评论(0)    收藏  举报

1.栅栏函数

  作用:控制线程的执行顺序

  注:栅栏函数不能使用全局并发队列

 1 -(void)barrier
 2 {
 3     //1.创建队列(并发队列)
 4     dispatch_queue_t queue = dispatch_queue_create("com.downloadqueue", DISPATCH_QUEUE_CONCURRENT);
 5     
 6     dispatch_async(queue, ^{
 7         
 8         for (NSInteger i = 0; i<10; i++) {
 9             NSLog(@"%zd-download1--%@",i,[NSThread currentThread]);
10         }
11     });
12     
13     dispatch_async(queue, ^{
14         
15         for (NSInteger i = 0; i<10; i++) {
16             NSLog(@"%zd-download2--%@",i,[NSThread currentThread]);
17         }
18     });
19     
20     //栅栏函数
21     dispatch_barrier_async(queue, ^{
22         NSLog(@"我是一个栅栏函数");
23     });
24     
25     dispatch_async(queue, ^{
26         
27         for (NSInteger i = 0; i<10; i++) {
28             NSLog(@"%zd-download3--%@",i,[NSThread currentThread]);
29         }
30     });
31     
32     dispatch_async(queue, ^{
33         
34         for (NSInteger i = 0; i<10; i++) {
35             NSLog(@"%zd-download4--%@",i,[NSThread currentThread]);
36         }
37     });
38 }
栅栏函数

 

2.延迟执行

 1 -(void)delay
 2 {
 3     NSLog(@"----");
 4     //表名2秒钟之后调用run
 5 //    [self performSelector:@selector(run) withObject:nil afterDelay:2.0];
 6     
 7 //    [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
 8     
 9     /*
10      第一个参数:延迟时间
11      第二个参数:要执行的代码
12      */
13     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_global_queue(0, 0), ^{
14         NSLog(@"---%@",[NSThread currentThread]);
15     });
16     
17 }
延迟执行

 

3.一次性代码

程序运行过程中只执行一次,执行一次后永远都不执行

1 -(void)once
2 {
3     static dispatch_once_t onceToken;
4     dispatch_once(&onceToken, ^{
5         NSLog(@"+++++++++");
6     });
7 }
一次性代码

 

4.快速迭代

 1 -(void)applay
 2 {
 3 //    for (NSInteger i=0; i<10; i++) {
 4 //        NSLog(@"%zd--%@",i,[NSThread currentThread]);
 5 //    }
 6     
 7     //创建队列(并发队列)
 8     dispatch_queue_t queue = dispatch_queue_create("com.downloadqueue", DISPATCH_QUEUE_CONCURRENT);
 9     /*
10      第一个参数:迭代的次数
11      第二个参数:在哪个队列中执行
12      第三个参数:block要执行的任务
13      */
14     dispatch_apply(10, queue, ^(size_t index) {
15         NSLog(@"%zd--%@",index,[NSThread currentThread]);
16     });
17 }
快速迭代
 1  
 2 
 3     //文件在哪个地方(文件夹)
 4 
 5     NSString *form = @"/Users/xiaomage/Desktop/form";
 6 
 7     //要剪切到什么地方
 8 
 9     NSString *to = @"/Users/xiaomage/Desktop/to";
10 
11 
12 
13 NSFileManager *manager = [NSFileManager defaultManager];
14 
15 //获取文件夹下子文件/子文件夹的路径
16 
17 //可以获取到子文件和子文件夹的路径
18 
19     NSArray *subpaths =  [manager subpathsAtPath:form];
20 
21 //   可以获取到子文件和子文件夹的路径
22 NSDirectoryEnumerator *enumer = [manager enumeratorAtPath:to];
23 
24 //只能获取子文件的路径
25 
26     NSDirectoryEnumerator *enumer = [manager directoryContentsAtPath:form];
27 
28 
29 
30  //创建队列(并发队列)
31 
32     dispatch_queue_t queue = dispatch_queue_create("com.downloadqueue", DISPATCH_QUEUE_CONCURRENT);
33 
34     
35 
36     NSInteger count = [subpaths count];
37 
38     dispatch_apply(count, queue, ^(size_t index) {
39 
40         
41 
42         NSString *subpath = subpaths[index];
43 
44         
45 
46         NSString *fullPath = [form stringByAppendingPathComponent:subpath];
47 
48         
49 
50         //拼接目标文件全路径
51 
52         NSString *fileName = [to stringByAppendingPathComponent:subpath];
53 
54         
55 
56         //剪切操作
57 
58         [manager moveItemAtPath:fullPath toPath:fileName error:nil];
59 
60         
61 
62         NSLog(@"%@",[NSThread currentThread]);
63 
64     });
用快速迭代实现文件夹内容的转移

 

5.队列组

有这么1种需求

首先:分别异步执行2个耗时的操作

其次:等2个异步操作都执行完毕后,再回到主线程执行操作
 1 -(void)group
 2 {
 3     //下载图片1
 4     
 5     //创建队列组
 6     dispatch_group_t group =  dispatch_group_create();
 7     
 8     //1.开子线程下载图片
 9     //创建队列(并发)
10     dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
11     
12     dispatch_group_async(group, queue, ^{
13         //1.获取url地址
14         NSURL *url = [NSURL URLWithString:@"http://www.huabian.com/uploadfile/2015/0914/20150914014032274.jpg"];
15         
16         //2.下载图片
17         NSData *data = [NSData dataWithContentsOfURL:url];
18         
19         //3.把二进制数据转换成图片
20         self.image1 = [UIImage imageWithData:data];
21         
22         NSLog(@"1---%@",self.image1);
23     });
24   
25     //下载图片2
26     dispatch_group_async(group, queue, ^{
27         //1.获取url地址
28         NSURL *url = [NSURL URLWithString:@"http://img1.3lian.com/img2011/w12/1202/19/d/88.jpg"];
29         
30         //2.下载图片
31         NSData *data = [NSData dataWithContentsOfURL:url];
32         
33         //3.把二进制数据转换成图片
34         self.image2 = [UIImage imageWithData:data];
35         NSLog(@"2---%@",self.image2);
36         
37     });
38     
39     //合成
40     dispatch_group_notify(group, queue, ^{
41         
42         //开启图形上下文
43         UIGraphicsBeginImageContext(CGSizeMake(200, 200));
44         
45         //画1
46         [self.image1 drawInRect:CGRectMake(0, 0, 200, 100)];
47         
48         //画2
49         [self.image2 drawInRect:CGRectMake(0, 100, 200, 100)];
50         
51         //根据图形上下文拿到图片
52         UIImage *image =  UIGraphicsGetImageFromCurrentImageContext();
53         
54         //关闭上下文
55         UIGraphicsEndImageContext();
56         
57         dispatch_async(dispatch_get_main_queue(), ^{
58             self.imageView.image = image;
59             NSLog(@"%@--刷新UI",[NSThread currentThread]);
60         });
61     });
62 }
用队列组合成网络上的两个图片