美文网首页
iOS GCD笔记

iOS GCD笔记

作者: 神码 | 来源:发表于2019-03-15 11:03 被阅读0次

    串行队列

    dispatch_queue_t queue = dispatch_queue_create("testQueue", DISPATCH_QUEUE_SERIAL);
    

    并发队列

    dispatch_queue_t queue = dispatch_queue_create("testQueue2", DISPATCH_QUEUE_CONCURRENT);
    

    主队列

    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    

    全局并发队列

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    

    同步执行

    dispatch_sync(queue, ^{
            //这里放同步执行任务代码
        });
    

    异步执行

    dispatch_async(queue, ^{
            //这里放异步执行任务代码
        });
    

    同步+并发队列 = 没有开启新线程,串行执行任务 sync Concurrent
    同步+串行队列 = 没有开启新线程,串行执行任务 sync Serial

    异步+并发队列 = 有开启新线程,并发执行任务 async Concurrent
    异步+串行队列 = 有开启新线程(1条),串行执行任务 async Serial

    同步+主队列 = 主线程调用:死锁 其他线程:没有开启新线程,串行执行任务
    异步+主队列 = 没有开启新线程,串行执行任务

    同步+并发队列(没有开启新线程,串行执行任务)

    - (void)syncConcurrent {
        dispatch_queue_t queue = dispatch_queue_create("syncConcurrent", DISPATCH_QUEUE_CONCURRENT);
        dispatch_sync(queue, ^{
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];//模拟耗时操作
                NSLog(@"1--%@",[NSThread currentThread]);
            }
        });
        dispatch_sync(queue, ^{
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];
                NSLog(@"2--%@",[NSThread currentThread]);
            }
        });
        dispatch_sync(queue, ^{
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];
                NSLog(@"3--%@",[NSThread currentThread]);
            }
        });
        NSLog(@"end");
    }
    

    同步+串行(没有开启新线程,串行执行任务)

    - (void)syncSerial {
        dispatch_queue_t queue = dispatch_queue_create("syncSerial", DISPATCH_QUEUE_SERIAL);
        dispatch_sync(queue, ^{
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];
                NSLog(@"1--%@",[NSThread currentThread]);
            }
        });
        dispatch_sync(queue, ^{
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];
                NSLog(@"2--%@",[NSThread currentThread]);
            }
        });
        dispatch_sync(queue, ^{
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];
                NSLog(@"3--%@",[NSThread currentThread]);
            }
        });
        NSLog(@"end");
    }
    

    异步+并发(可开启多个线程,任务交替(同时)执行)

    - (void)asyncConcurrent {
        dispatch_queue_t queue = dispatch_queue_create("asyncConcurrent", DISPATCH_QUEUE_CONCURRENT);
        dispatch_async(queue, ^{
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];
                NSLog(@"1--%@",[NSThread currentThread]);
            }
        });
        dispatch_async(queue, ^{
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];
                NSLog(@"2--%@",[NSThread currentThread]);
            }
        });
        dispatch_async(queue, ^{
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];
                NSLog(@"3--%@",[NSThread currentThread]);
            }
        });
        NSLog(@"end");
    }
    

    异步+串行(有开启新线程(1条),串行执行任务)

    - (void)asyncSerial {
        dispatch_queue_t queue = dispatch_queue_create("asyncSerial", DISPATCH_QUEUE_SERIAL);
        dispatch_async(queue, ^{
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];
                NSLog(@"1--%@",[NSThread currentThread]);
            }
        });
        dispatch_async(queue, ^{
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];
                NSLog(@"2--%@",[NSThread currentThread]);
            }
        });
        dispatch_async(queue, ^{
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];
                NSLog(@"3--%@",[NSThread currentThread]);
            }
        });
        NSLog(@"end");
    }
    

    同步执行+主队列(主线程调用:死锁)

    - (void)syncMain {
        dispatch_queue_t queue = dispatch_get_main_queue();
        dispatch_sync(queue, ^{
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];
                NSLog(@"1--%@",[NSThread currentThread]);
            }
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];
                NSLog(@"2--%@",[NSThread currentThread]);
            }
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];
                NSLog(@"3--%@",[NSThread currentThread]);
            }
        });
        NSLog(@"end");
    }
    

    同步执行+主队列(其他线程调用:没有开启新线程,串行执行任务)

    - (void)syncMain2 {
        [NSThread detachNewThreadSelector:@selector(syncMain) toTarget:self withObject:nil];
    }
    

    异步执行+主队列(只在主线程中执行任务,执行完一个任务,再执行下一个任务)

    - (void)asyncMain {
        dispatch_queue_t queue = dispatch_get_main_queue();
        dispatch_async(queue, ^{
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];
                NSLog(@"1--%@",[NSThread currentThread]);
            }
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];
                NSLog(@"2--%@",[NSThread currentThread]);
            }
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];
                NSLog(@"3--%@",[NSThread currentThread]);
            }
        });
        NSLog(@"end");
    }
    

    GCD线程间的通信

    - (void)communication {
        //全局并发队列
        dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
        //主队列
        dispatch_queue_t mainQueue = dispatch_get_main_queue();
        
        dispatch_async(queue, ^{
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];
                NSLog(@"1--%@",[NSThread currentThread]);
            }
            //回主线程
            dispatch_async(mainQueue, ^{
                [NSThread sleepForTimeInterval:2];
                NSLog(@"2--%@",[NSThread currentThread]);
            });
        });
    }
    

    栅栏方法 dispatch_barrier_async

    - (void)barrier {
        dispatch_queue_t queue = dispatch_queue_create("testQueue", DISPATCH_QUEUE_CONCURRENT);
        
        dispatch_async(queue, ^{
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];
                NSLog(@"1--%@",[NSThread currentThread]);
            }
        });
        dispatch_async(queue, ^{
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];
                NSLog(@"2--%@",[NSThread currentThread]);
            }
        });
        
        dispatch_barrier_async(queue, ^{
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];
                NSLog(@"barrier--%@",[NSThread currentThread]);
            }
        });
        dispatch_async(queue, ^{
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];
                NSLog(@"3--%@",[NSThread currentThread]);
            }
        });
        dispatch_async(queue, ^{
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];
                NSLog(@"4--%@",[NSThread currentThread]);
            }
        });
    }
    

    GCD延时执行方法: dispatch_after

    - (void)after {
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            //3秒后执行
            NSLog(@"after---%@",[NSThread currentThread]);
        });
    }
    

    GCD一次性代码

    -(void)once {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            //只执行一次的代码(这里默认是线程安全的)
        });
    }
    

    GCD快速迭代

    -(void)apply {
        dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
        NSLog(@"apply begin");
        dispatch_apply(6, queue, ^(size_t index) {
            NSLog(@"%zd---%@",index, [NSThread currentThread]);
        });
        NSLog(@"apple end");
    }
    

    GCD队列组 dispatch_group
    dispatch_group_notify(监听group中任务完成的状态,当所有的任务都执行完成后,追加任务到group中,并执行任务)

    - (void)groupNotify {
        dispatch_group_t group = dispatch_group_create();
        dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];
                NSLog(@"1--%@",[NSThread currentThread]);
            }
        });
        dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];
                NSLog(@"2--%@",[NSThread currentThread]);
            }
        });
        dispatch_group_notify(group, dispatch_get_main_queue(), ^{
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];
                NSLog(@"3--%@",[NSThread currentThread]);
            }
        });
    }
    

    dispatch_group_wait(暂停(阻塞)当前线程,等待指定的group中的任务执行完成后,才会往下继续执行)

    - (void)groupWait {
        dispatch_group_t group = dispatch_group_create();
        dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];
                NSLog(@"1--%@",[NSThread currentThread]);
            }
        });
        dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
            for (int i = 0; i < 2; i++) {
                [NSThread sleepForTimeInterval:2];
                NSLog(@"2--%@",[NSThread currentThread]);
            }
        });
        dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
        NSLog(@"group---end");
    }
    

    线程安全,使用semaphore加锁

    - (void)initTicketStatusSave {
        semaphoreLock = dispatch_semaphore_create(1);
        self.ticketCount = 100;
        
        dispatch_queue_t queue1 = dispatch_queue_create("queue1", DISPATCH_QUEUE_SERIAL);
        dispatch_queue_t queue2 = dispatch_queue_create("queue2", DISPATCH_QUEUE_SERIAL);
        
        __weak typeof(self) weakSelf = self;
        
        dispatch_async(queue1, ^{
            [weakSelf saleTicketNotSafe];
        });
        dispatch_async(queue2, ^{
            [weakSelf saleTicketNotSafe];
        });
    }
    - (void)saleTicketSafe {
        while (1) {
            //加锁
            dispatch_semaphore_wait(semaphoreLock, DISPATCH_TIME_FOREVER);
            if (self.ticketCount > 0) {
                self.ticketCount--;
                NSLog(@"%@",[NSString stringWithFormat:@"剩余票数 %ld   窗口:%@",(long)self.ticketCount,[NSThread currentThread]]);
            } else {
                NSLog(@"所有票已售完");
                //相当于解锁
                dispatch_semaphore_signal(semaphoreLock);
                break;
            }
            //相当于解锁
            dispatch_semaphore_signal(semaphoreLock);
        }
    }
    

    参考:https://www.jianshu.com/p/2d57c72016c6

    相关文章

      网友评论

          本文标题:iOS GCD笔记

          本文链接:https://www.haomeiwen.com/subject/vhqlmqtx.html