1 #import "ViewController.h" 2 3 @interface ViewController () 4 5 @end 6 7 @implementation ViewController 8 9 - (void)viewDidLoad { 10 [super viewDidLoad]; 11 // Do any additional setup after loading the view, typically from a nib. 12 //1.多次执行相同的代码块 13 [self testApply]; 14 //2.代码块只执行一次 15 //[self testOnce]; 16 //[self testOnce]; 17 //[self testOnce]; 18 //[self testOnce]; 19 //3.代码块在一段时间后执行 20 //[self testAfter]; 21 //4.将线程放到一个组里面 22 //[self testGroup]; 23 //5.在两个线程序列之间执行一段代码 24 //[self testBarrier]; 25 } 26 27 //在两个线程序列之间执行一段代码 28 -(void)testBarrier 29 { 30 //队列不能是系统的全局并行队列 31 //使用自己创建的并行队列 32 dispatch_queue_t conQueue = dispatch_queue_create("conQueue", DISPATCH_QUEUE_CONCURRENT); 33 //线程一 34 dispatch_async(conQueue, ^{ 35 for (int i=0; i<100; i++) { 36 NSLog(@"线程一:%d",i); 37 } 38 }); 39 40 //线程二 41 dispatch_async(conQueue, ^{ 42 for (int i=0; i<100; i++) { 43 NSLog(@"线程二:%d",i); 44 } 45 }); 46 47 //在线程一,线程二执行完成之后,在线程三执行之前执行一段代码 48 dispatch_barrier_async(conQueue, ^{ 49 NSLog(@"barrier"); 50 }); 51 52 //线程三 53 dispatch_async(conQueue, ^{ 54 for (int i=0; i<100; i++) { 55 NSLog(@"线程三:%d",i); 56 } 57 }); 58 } 59 60 //将线程放到一个组里面 61 -(void)testGroup 62 { 63 dispatch_group_t group = dispatch_group_create(); 64 //获取全局队列 65 dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 66 //参数一:线程所在的组 67 //参数二:线程所在的队列 68 //参数三:线程的执行体 69 //线程一 70 dispatch_group_async(group, globalQueue, ^{ 71 for (int i=0; i<100; i++) { 72 NSLog(@"线程一:%d",i); 73 } 74 }); 75 //线程二 76 dispatch_group_async(group, globalQueue, ^{ 77 for (int i=0; i<100; i++) { 78 NSLog(@"线程二:%d",i); 79 } 80 }); 81 82 83 dispatch_group_notify(group, globalQueue, ^{ 84 //在线程组里的所有线程执行完成后调用的代码 85 NSLog(@"线程组执行完成"); 86 }); 87 } 88 89 //代码块在一段时间后执行 90 -(void)testAfter 91 { 92 NSLog(@"执行之前"); 93 //时间 94 //当前时间十秒之后 95 dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC*10); 96 //参数一:时间 97 //参数二:线程所在的队列 98 //参数三:线程的执行体 99 dispatch_after(time, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 100 NSLog(@"执行了after"); 101 }); 102 } 103 104 //代码块只执行一次 105 -(void)testOnce 106 { 107 static dispatch_once_t onceToken; 108 109 dispatch_once(&onceToken,^{ 110 NSLog(@"执行一次"); 111 }); 112 } 113 114 //多次执行相同的代码块 115 -(void)testApply 116 { 117 //参数一:代码块执行的次数 118 //参数二:代码块所在的队列 119 //参数三:代码块的内容 120 size_t t = 10; 121 //队列 122 dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 123 dispatch_apply(t, globalQueue, ^(size_t time) { 124 NSLog(@"第%ld次",time); 125 }); 126 } 127 128 - (void)didReceiveMemoryWarning { 129 [super didReceiveMemoryWarning]; 130 // Dispose of any resources that can be recreated. 131 } 132 133 @end