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 }
浙公网安备 33010602011771号