美文网首页GXiOS
iOS开发--GCD

iOS开发--GCD

作者: Caesar_62dd | 来源:发表于2019-06-08 23:30 被阅读44次

前言:GCD是用的最多的多线程方法,本来以为很难,但是看了两天的视频发现其实并没有想象的那么可怕.

一、队列和同步异步方法.

各种队列执行效果.png

二、 GCD常用方法:

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    [self groupQueue];
}
//1.同步+串行队列--->无法开启新线程,串行执行
- (void)serielSync{
//    dispatch_queue_t queue = dispatch_queue_create("com.gx.www", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t queue = dispatch_queue_create("com.gx.www", NULL);
    dispatch_sync(queue, ^{
        NSLog(@"______%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"--222----%@", [NSThread currentThread]);
    });
}
//2.异步+串行队列--->开启一条新线程,串行执行
- (void)serielAsync{
//    dispatch_queue_t queue = dispatch_queue_create("com.gx.www", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t queue = dispatch_queue_create("com.gx.www", NULL);
    dispatch_async(queue, ^{
        NSLog(@"______%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"--222----%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"---333---%@", [NSThread currentThread]);
    });
}
//3.同步+并发队列--->无法开启新线程,串行执行
- (void)concurrentSync{
    dispatch_queue_t queue = dispatch_queue_create("com.gx.www", DISPATCH_QUEUE_CONCURRENT);
    dispatch_sync(queue, ^{
        NSLog(@"_________%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"--222----%@", [NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"---333---%@", [NSThread currentThread]);
    });
}
//4.异步+并发队列--->开启多条线程(不确定线程个数),并发执行
- (void)concurrentAsync{
    dispatch_queue_t queue = dispatch_queue_create("com.gx.www", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        NSLog(@"_________%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"--222----%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"---333---%@", [NSThread currentThread]);
    });
}
//5.同步+全局主队列(全局串行队列)--->死锁
- (void)mainQueueSync{
    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_sync(queue, ^{
        NSLog(@"----%@----",[NSThread currentThread]);
    });
}
//6.异步+全局主队列--->无法开启新线程,串行执行
- (void)mainQueueAsync{
    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_async(queue, ^{
        NSLog(@"----%@----",[NSThread currentThread]);
    });
}
//7.同步+全局并发队列--->无法开启新线程,串行执行
- (void)globalQueueSync{
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_sync(queue, ^{
        NSLog(@"--1--%@----", [NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"--2--%@----", [NSThread currentThread]);
    });
}
//8.异步+全局并发队列--->开启多条线程,并发执行
- (void)globalQueueAsync{
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        NSLog(@"--1--%@----", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"--2--%@----", [NSThread currentThread]);
    });
}
//9.GCD常用函数-after,延迟执行
- (void)delayQueue{
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC) ), dispatch_get_main_queue(), ^{
        NSLog(@"---%@---", [NSThread currentThread]);
    });
}
//10.GCD常用函数-once 一次性代码(单例使用,不能作为懒加载使用)
- (void)onceQueue{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSLog(@"---%@---", [NSThread currentThread]);
    });
    
}
//11.GCD常用函数-栅栏函数-barrier--->控制异步函数的执行顺序
- (void)barrierQueue{
//    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //栅栏函数不能在全局并发队列中使用,要自己创建并发队列(全局并发队列和手动创建并发队列的区别之一)
    dispatch_queue_t queue = dispatch_queue_create("download", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        NSLog(@"---Download1---%@---",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"---Download2---%@---",[NSThread currentThread]);
    });
    dispatch_barrier_async(queue, ^{
        NSLog(@"++++++++++++++++++++++++++");
    });
    dispatch_async(queue, ^{
        NSLog(@"---Download3---%@---",[NSThread currentThread]);
    });
}
//12.GCD常用函数-快速迭代-apply--->无法控制执行顺序
- (void)applyQueue{
    NSString *from = @"/Users/gaoxiong/Desktop/from";
    NSString *to =@"/Users/gaoxiong/Desktop/to";
    NSFileManager *fileMagager = [NSFileManager defaultManager];
    //获取目录下所有文件
    NSArray *subPath = [fileMagager subpathsAtPath:from];
    NSLog(@"%@", subPath);
    NSInteger count = subPath.count;
    dispatch_apply(count, dispatch_get_global_queue(0, 0), ^(size_t index) {
        NSString *fullPathFrom = [from stringByAppendingPathComponent:subPath[index]];
        NSString *fullPathTo = [to stringByAppendingPathComponent:subPath[index]];
        [fileMagager moveItemAtPath:fullPathFrom toPath:fullPathTo error:nil];
        NSLog(@"=-----%@-----%@", subPath[index], [NSThread currentThread]);
    });
}
//13.GCD常用函数-gruop-线程组---->控制异步函数的执行顺序
- (void)groupQueue{
    dispatch_group_t gruop = dispatch_group_create();
    dispatch_queue_t queue = dispatch_queue_create("com.gx.www", DISPATCH_QUEUE_CONCURRENT);
    dispatch_group_async(gruop, queue, ^{
        NSLog(@"---------1----%@", [NSThread currentThread]);
    });
    dispatch_group_async(gruop, queue, ^{
        NSLog(@"---------2----%@", [NSThread currentThread]);
    });
    dispatch_group_async(gruop, queue, ^{
        NSLog(@"---------3----%@", [NSThread currentThread]);
    });
    dispatch_group_notify(gruop, queue, ^{
        NSLog(@"------the last performence !!--- %@", [NSThread currentThread]);
    });
}
@end

相关文章

  • iOS开发多线程之GCD

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 GCD...

  • iOS开发之GCD并发队列

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 03 ...

  • iOS开发之GCD同步任务加强

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 004...

  • iOS开发之GCD串行队列

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 实例d...

  • iOS 开发之 GCD 不同场景使用

    iOS 开发之 GCD 不同场景使用 本文在iOS 开发值 GCD 基础 的基础上,继续总结了 GCD 的一些AP...

  • IOS GCD

    转载: IOS GCD GCD 是在iOS开发多线程技术里面,使用最简单,执行效率最高的,是相对底层的API,都是...

  • iOS 开发之 GCD 基础

    iOS 开发之 GCD 基础 本文主要为 GCD 的 队列和执行方法等基础总结,目录如下: [TOC] GCD是什...

  • iOS多线程编程之GCD详解(一)

    1. GCD简介 iOS开发中多线程的API主要有pthread,NSThread,NSOperation和GCD...

  • iOS学习笔记11-多线程入门

    一、iOS多线程 iOS多线程开发有三种方式: NSThread NSOperation GCD iOS在每个进程...

  • iOS-多线程篇—GCD介绍

    iOS开发多线程篇—GCD介绍一、简单介绍1.什么是GCD?全称是Grand Central Dispatch,可...

网友评论

    本文标题:iOS开发--GCD

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