美文网首页
【iOS开发】多线程 - GCD

【iOS开发】多线程 - GCD

作者: Huangbaoqin | 来源:发表于2017-09-21 23:15 被阅读12次

GCD(Grand Central Dispatch)俗称大中枢派发

  • 线程改进示意图
改进的线程
  • dispatch_queue_t 示意图
dispatch_queue_t
  • 队列
dispatch_queue_t queue
  • 创建队列
//第一个参数为队列名,第二个参数为串行或者并行
dispatch_queue_t queue = dispatch_queue_create("com.huangbaoqin.GCDQueue", DISPATCH_QUEUE_CONCURRENT);
  • 使用队列
dispatch_queue_t queue = dispatch_queue_create("com.huangbaoqin.GCDQueue", DISPATCH_QUEUE_CONCURRENT); 
// 异步
dispatch_async(queue, ^{
    // do something
});
// 同步(必须执行完都something之后才会执行dispatch_sync之后的代码)
dispatch_sync(queue, ^{
    // do something
});

  • dispatch queue 的种类

    • Main Dispatch Queue
      • 有且只有一个
      • 里面所有的任务都是要在主线程中执行
    • Serial Queue


    • Concurrent Queue


  • 一些内置的Queue

// #define DISPATCH_QUEUE_PRIORITY_HIGH 2
// #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0
// #define DISPATCH_QUEUE_PRIORITY_LOW (-2)
// #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
  • dispatch_affter
// 不能取消
void
dispatch_after(dispatch_time_t when,
    dispatch_queue_t queue,
    dispatch_block_t block);

  • GCD中的线程安全
dispatch_async(_queue, ^{
    self.a ++;
})
  • 死锁

  • dispatch_once

多线程下单例产生两个对象
+ (instancetype)sharedObj {
    static singleOBJ *instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[singleOBJ alloc] init];
    });
    return instance;
}
  • dispatch_semaphore_t 信号量,控制并发数

  • dispatch_group_t

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    //  把Queue中的任务统一放到group中处理,在后台线程中等待group处理完成后切换到主线程操作UI

    _imageView1.image = nil;
    _imageView2.image = nil;
    _imageView3.image = nil;
    _imageView4.image = nil;
    __block UIImage *image1, *image2, *image3, *image4 = nil;
    
    dispatch_group_t group = dispatch_group_create();

    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        image1 = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:url1]]];
    });
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        image2 = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:url2]]];
    });
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        image3 = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:url3]]];
    });
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        image4 = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:url4]]];
    });
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
        dispatch_async(dispatch_get_main_queue(), ^{
            _imageView1.image = image1;
            _imageView2.image = image2;
            _imageView3.image = image3;
            _imageView4.image = image4;
        });
    });
}

相关文章

  • 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学习笔记11-多线程入门

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

  • iOS多线程入门

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

  • iOS多线程:『GCD』详尽总结

    iOS多线程:『GCD』详尽总结 iOS多线程:『GCD』详尽总结

  • IOS GCD

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

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

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

  • iOS-多线程篇—GCD介绍

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

网友评论

      本文标题:【iOS开发】多线程 - GCD

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