【iOS开发-多线程】使用GCD创建多线程(iOS常用技术)

GCD

全称是Grand Central Dispatch

特点:

  1. 自动利用CPU的多核技术
  2. 自动管理线程的生命周期

使用步骤

  1. 定制任务
  2. 将任务添加队列

各类队列的特点

这里写图片描述

关于同步和异步的两种执行方式

   /**
     *  同步方式执行任务,不管是什么队列,都不会再开一个线程
     */
    dispatch_sync(<#dispatch_queue_t queue#>, ^{
        <#code#>
    })

    /**
     *  异步方式执行任务,除了主队列都会开启一个新线程
     */
    dispatch_async(<#dispatch_queue_t queue#>, ^{
        <#code#>
    })

创建队列

全局并发队列

//获得全局的并发队列,第一个参数是优先级,一般都是0,第二个参数是预留的,也为0
  dispatch_get_global_queue(<#long identifier#>, <#unsigned long flags#>)

使用

   dispatch_queue_t queue =  dispatch_get_global_queue(0, 0);
    /**
     *  同步方式执行任务
     */
    dispatch_sync(queue, ^{
        NSLog(@"%@", NSThread.currentThread);//{number = 1, name = main}
    });

    /**
     *  异步方式执行任务
     */
    dispatch_async(queue, ^{
         NSLog(@"%@", NSThread.currentThread);//{number = 2, name = (null)}
    });

串行队列

//第一个参数是队列的名字,第二个参数为nil
dispatch_queue_create(<#const char *label#>, <#dispatch_queue_attr_t attr#>)
dispatch_queue_t queue = dispatch_queue_create("ttf", nil);
    /**
     *  同步方式执行任务
     */
    dispatch_sync(queue, ^{
        NSLog(@"%@", NSThread.currentThread);
    });

    /**
     *  异步方式执行任务
     */
    dispatch_async(queue, ^{
         NSLog(@"%@", NSThread.currentThread);
    });

使用主队列

主队列不能和同步执行方式一起使用,不然会死锁
要使用异步的执行方式

dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_queue_t queue = dispatch_get_main_queue();
    /**
     *  同步方式执行任务
     */
//    dispatch_sync(queue, ^{
//        NSLog(@"%@", NSThread.currentThread);
//    });

    /**
     *  异步方式执行任务
     */
    dispatch_async(queue, ^{
         NSLog(@"%@", NSThread.currentThread);
    });

线程之间的通讯

dispatch_async(
dispatch_get_global_queue(0, 0), ^{
    // 执行耗时的异步操作...
   dispatch_async(dispatch_get_main_queue(), ^{
     // 回到主线程,执行UI刷新操作
   });
});

//异步下载图片

    UIImageView *imageView = [[UIImageView alloc] init];
    imageView.frame = CGRectMake(100, 100, 100, 100);
    imageView.backgroundColor = [UIColor redColor];
    [self.view addSubview:imageView];

    dispatch_queue_t queue =  dispatch_get_global_queue(0, 0);

    dispatch_async(queue, ^{

        NSURL *url = [NSURL URLWithString:@"http://img6.cache.netease.com/cnews/2015/5/13/20150513153022b6a55.jpg"];
        NSData *data = [NSData dataWithContentsOfURL:url]; // 这行会比较耗时
        UIImage *image = [UIImage imageWithData:data];

        dispatch_async(dispatch_get_main_queue(), ^{
            imageView.image = image;
        });
    });

一次性代码

//代码整个程序只被执行一次

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

队列组

可以吧几个线程加载到队列组里面,等这个组里面的线程全部执行完毕,再做其他事情

dispatch_group_t group =  dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // 执行1个耗时的异步操作
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // 执行1个耗时的异步操作
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    // 等前面的异步操作都执行完毕后,回到主线程...
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值