IOS GCD学习课程一
GCD是一个替代诸如NSThread等技术的很高效和强大的技术。GCD完全可以处理诸如数据锁定和资源泄漏等复杂的异步编程问题。GCD的工作原理是让一个程序,根据可用的处理资源,安排他们在任何可用的处理器核心上平行排队执行特定的任务。这个任务可以是一个功能或者一个程序段。
GCD仍然在一个很低的水平使用线程,但是它不需要程序员关注太多的细节。GCD创建的队列是轻量级的,苹果声明一个GCD的工作单元需要由15个指令组成。也就是说创造一个传统的线程很容易的就会需要几百条指令。
GCD中的一个任务可被用于创造一个被放置于队列的工作项目或者事件源。如果一个任务被分配到一个事件源,那么一个由功能或者程序块组成的工作单元会被放置于一个适当的队列中。苹果公司认为GCD相比于普通的一个接一个的执行任务的方式更为有效率。
下面列举几个例子
1、异步串行队列
1 #pragma mark 串行队列 2 //意思是要在同一个线程中 myQueues0执行完才执行myQueues1,一个个执行 3 -(void)start:(id)sender{ 4 //创建一个队列 第一个参数是标识队列的,第二个参数是用来定义队列的参数(目前不支持,因此传入NULL) 5 _textField.text = @"异步串行线程执行中"; 6 dispatch_queue_t myQueue = dispatch_queue_create("com.aini.q1", NULL); 7 8 //把myQueue1这个队列放在异步线程中去执行 这里让其停留13秒 9 dispatch_async(myQueue, ^{ 10 NSLog(@"%@ %@",@"myQueues0",[NSThread currentThread]); 11 for (int i=0; i< 3; i++) { 12 [NSThread sleepForTimeInterval:1]; 13 NSLog(@"myQueues0 run %i",i); 14 } 15 16 //要用dispatch_sync(同步)在主线程中执行UI更新操作, 17 dispatch_sync(dispatch_get_main_queue(), ^{ 18 _textField.text = @"异步串行线程0执行完毕"; 19 }); 20 }); 21 22 dispatch_async(myQueue, ^{ 23 NSLog(@"%@ %@",@"myQueues1",[NSThread currentThread]); 24 for (int i=0; i< 5; i++) { 25 [NSThread sleepForTimeInterval:1]; 26 NSLog(@"myQueues1 run %i",i); 27 } 28 29 dispatch_sync(dispatch_get_main_queue(), ^{ 30 _textField.text = @"异步串行线程1执行完毕"; 31 }); 32 }); 33 34 dispatch_release(myQueue); 35 }
2、异步并行队列
1 #pragma mark 并行队列 2 //意思是要myQueues0 myQueues1在不同线程同时执行 3 -(void)start2:(id)sender{ 4 _textField.text = @"异步并行线程执行中"; 5 //创建一个并行队列 6 dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 7 dispatch_async(myQueue,^{ 8 NSLog(@"%@ %@",@"myQueues0",[NSThread currentThread]); 9 for (int i=0; i< 5; i++) { 10 [NSThread sleepForTimeInterval:1]; 11 NSLog(@"myQueues0 run %i",i); 12 } 13 14 dispatch_sync(dispatch_get_main_queue(), ^{ 15 _textField.text = @"异步并行线程0执行完毕"; 16 }); 17 }); 18 19 dispatch_async(myQueue,^{ 20 NSLog(@"%@ %@",@"myQueues1",[NSThread currentThread]); 21 for (int i=0; i< 7; i++) { 22 [NSThread sleepForTimeInterval:1]; 23 NSLog(@"myQueues1 run %i",i); 24 } 25 26 dispatch_sync(dispatch_get_main_queue(), ^{ 27 _textField.text = @"异步并行线程1执行完毕"; 28 }); 29 }); 30 }
3、dispatch_after使用
1 -(void)start3:(id)sender{ 2 _textField.text = @"停留4秒执行中"; 3 double delayInSeconds = 4.0; 4 //从现在开始计算4秒 5 dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 6 //4秒过后会调用block里面的方法 ,在主线程中调用方法来更改UI 7 dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 8 _textField.text = @"停留完闭中"; 9 }); 10 }
代码:https://github.com/mayaole/igcdcourse,大家可以下载来运行一下