iOS多线程中的实际方案之三GCD

2016-04-24  本文已影响0人  紫菱清风

GCD(基于C语言的底层API,用Block定义任务)


GCD的核心概念


GCD 演练


1.同步串行队列

#pragma mark 同步串行队列
void gcddemo1(){
// 1.创建一个串行队列,意味着说队列里的任务是一个接着一个执行(类似于排队跑步)dispatch_queue_t q = dispatch_queue_create("serial", DISPATCH_QUEUE_SERIAL);
// 2.往 ‘队列中’ 添加 ‘任务’,这个任务是同步的,//同步意味着任务的执行是在当前线程中,如果当前是主线程,任务就在主线程中运行
for (int i = 0; i < 10; i++) {dispatch_sync(q, ^{
NSLog(@"%@ 任务%d",[NSThread currentThread],i);});
}}

2.异步串行队列

#pragma mark 异步串行队列
void gcddemo2(){
// 1.创建一个串行队列,意味着说队列里的任务是一个接着一个执行(类似于排队跑步)dispatch_queue_t q = dispatch_queue_create("gz.itcast.cn", DISPATCH_QUEUE_SERIAL);
// 2.往 ‘队列中’ 添加 ‘任务’,这个任务是异步的,// 异步意味着任务的执行会开启新线程来执行,我们称为子线程
for (int i = 0; i < 10; i++) {dispatch_async(q, ^{
NSLog(@"%@ 任务%d",[NSThread currentThread],i);});
}}

3.同步并发队列

#pragma mark 同步并行队列
void gcddemo3(){
// 1.创建一个并行队列,意味着说队列里的任务是抢着执行(类似于并排跑步比赛)dispatch_queue_t q = dispatch_queue_create("gz.itcast.cn", DISPATCH_QUEUE_CONCURRENT);
// 2.往 ‘队列中’ 添加 ‘任务’,这个任务是同步的,同步意味着代码的执行是在当前线程// 但是在同步任务中,并行队列里的任务会依序执行for (int i = 0; i < 10; i++) {
dispatch_sync(q, ^{NSLog(@"%@ 任务%d",[NSThread currentThread],i);
});}
}

4.异步并发队列

#pragma mark 异步并行队列
void gcddemo4(){
// 1.创建一个并行队列,意味着说队列里的任务是抢着执行(类似于并排跑步比赛)dispatch_queue_t q = dispatch_queue_create("gz.itcast.cn", DISPATCH_QUEUE_CONCURRENT);
// 2.往 ‘队列中’ 添加 ‘任务’,这个任务是异步的,异步意味着任务的执行是在子线程// 在异步任务中,并行队列里的任务会抢占式执行// 线程的开销由系统调试,任务的执行顺序是不同的for (int i = 0; i < 10; i++) {
dispatch_async(q, ^{
NSLog(@"%@ 任务%d",[NSThread currentThread],i);});
}}

5.全局队列(和并发队列的执行效果相同)

#pragma mark 全局队列
void gcddemo5(){
// 1.获取全局队列,全局队列供所有APP使用dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 2.往 ‘全局队列’ 添加 ‘任务’// 2.1异步里添加同步dispatch_async(q, ^{
NSLog(@"异步任务 %@ ",[NSThread currentThread]);for (int i = 0; i < 10; i++) {
//在同步任务中,全局队列里的任务会顺序执行dispatch_sync(q, ^{
NSLog(@"%@ 任务%d",[NSThread currentThread],i);});
}});
//2.2同步里添加异步dispatch_sync(q, ^{
NSLog(@"同步任务 %@ ",[NSThread currentThread]);for (int i = 0; i < 10; i++) {
//在异步任务中,全局队列里的任务会抢战执行dispatch_async(q, ^{
NSLog(@"%@ 任务%d",[NSThread currentThread],i);});
}});
}

6.主队列

7.Barrier 异步

8.延迟执行

[self performSelector:@selector(run) withObject:nil afterDelay:2.0];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW,
(int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(),^{
          // 2秒后异步执行这里的代码...
});

9.调度组

// 1. 调度组
    dispatch_group_t group = dispatch_group_create();
    
    // 2. 队列
    dispatch_queue_t q = dispatch_get_global_queue(0, 0);
    
    // 3. 将任务添加到队列和调度组
    dispatch_group_async(group, q, ^{
        [NSThread sleepForTimeInterval:1.0];
        NSLog(@"任务 1 %@", [NSThread currentThread]);
    });
    dispatch_group_async(group, q, ^{
        NSLog(@"任务 2 %@", [NSThread currentThread]);
    });
    dispatch_group_async(group, q, ^{
        NSLog(@"任务 3 %@", [NSThread currentThread]);
    });
    
    // 4. 监听所有任务完成
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"OVER %@", [NSThread currentThread]);
    });
    
    // 5. 判断异步
    NSLog(@"come here");

自我小结


上一篇下一篇

猜你喜欢

热点阅读