GCD实际应用

GCD

先行概念
程序:是为了实现特定目标或解决特定问题而用计算机语言编程的命令序列集合。程序分为两种:系统程序与应用程序
进程:这里为了避免引入过多的概念造成误解与便于后续问题的展开就粗暴与错误的理解:正在执行的程序
线程:线程是进程的一个独立执行的路径,被认为是轻量级的线程。一个进程可以包含多个线程,并且至少有一个主线程.
多线程:多线程就是一个程序的中有多条执行路径。在iOS中将一些比较耗时的操作放在另一条执行路径中,让他与主线程同时运行,这样不会造成主线程的阻塞
同步任务:在线程中有执行顺序,不会开启新的线程(对资源访问方式:资源被占用时等待)
异步任务:在线程中执行没有顺序,看cup是否空闲。在主队列中不会开启新的线程,其他队列会开启新的线程(对资源访问方式:资源被占用时执行其他任务)
队列:队列可以把它理解为管理任务的,它里面放着很多的任务。来管理这些任务在哪些线程中执行。队列是先进先出的
死锁:两个人都要用一个东西造成争执不下

GCD创建队列并在队列中管理线程,
队列分为用户队列(串行、并行队列),全局队列(并行队列),主队列。队列中调度线程,线程又分为同步线程与异步线程。一个队列可以操作多个线程,这些线程按照队列的类型进行执行,或并行或串行
进程中存在三个全局队列:高,中,低(默认)

全局队列创建方式

dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

全局队列在使用是最好使用默认优先级,因为设置优先级容易造成”优先级反转“。具体的可以自行了解

一个串行队列实例

dispatch_queue_t _serialQueue;//调度队列
//创建串行队列
- (dispatch_queue_t)serialQueue
{
    if (!_serialQueue) {
        //DISPATCH_QUEUE_SERIAL串行队列 DISPATCH_QUEUE_CONCURRENT 为并行队列(创建并行队列时队列)
        _serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
    }
    return _serialQueue;
}
//添加一个异步请求到该队列中 执行异步请求
dispatch_async([self serialQueue], ^{
        [weakSelf requestPersonInfo];//这是第一个任务
        /*dispatch_sync([self serialQueue], ^{//执行同步请求
            NSLog(@"串行队列开启异步任务后嵌套同步任务造成死锁,串行队列中开启同步任务后嵌套同步任务造成死锁");
        });*/
});
//再添加一个异步请求到该队列中
 dispatch_async([self serialQueue], ^{
           [self requestVedioList];//把block中的任务放入串行队列中执行,这是第二个任务
 });
//获取主队列并执行异步操作
//涉及UI更新的操作,放入主线程中.主线程队列中不能开启同步,会阻塞主线程。用dispatch_sync尝试下
 dispatch_async(dispatch_get_main_queue(), ^{
                _labelTitle.text = infoDB.tilte;
 });

一个并行调度组队列实例

//队列调度组
dispatch_group_t _groupQueue;   
//创建一个线程队列组.该组内所有线程执行完成后会回调一个方法。通知组内所有线程已经完成
- (dispatch_group_t)groupQueue{
    if(!_groupQueue){
        _groupQueue = dispatch_group_create();
    }
    return _groupQueue;
}

dispatch_group_async([self groupQueue], dispatch_get_global_queue(0,0), ^{
// 并行执行的线程一
});
dispatch_group_async([self groupQueue], dispatch_get_global_queue(0,0), ^{
// 并行执行的线程二
});
dispatch_group_notify([self groupQueue], dispatch_get_global_queue(0,0), ^{
// 汇总结果
});
//通过GCD创建单例
+ (instancetype)lessionInfoViewControllerInfo
{
    static LessionInfoViewController *lessionInfoViewController = nil;
    static dispatch_once_t onceToken;//仅执行一次
    dispatch_once(&onceToken, ^{
        lessionInfoViewController = [[LessionInfoViewController alloc] init];
    });
    return lessionInfoViewController;
}

你可能感兴趣的:(IOS)