ios开发之多线程GCD

简介

GCD(Grand Central Dispatch)纯C语言编写,提供非常强大的函数,是目前苹果官方网推荐的多线程开发方法,NSOperation便是基于GCD的封装。

GCD的优势

1.GCD是苹果公司为多核的并行运算提供了解决方案
2.GCD会自动利用更多的CPU内核(比如:双核、四核)
3.GCD自动管理线程的生命周期(创建线程、跳读任务、销毁线程)
4.程序员只需要告诉GCD想要执行什么任务,不需要编写任务线程管理任务

GCD的两个核心概念

1.任务:执行什么操作
2.队列:用来存放任务

GCD的队列可分为两大类

并发队列(Concurrent Dispatch Queue)可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)并发功能只有在异(dispatch_async)函数下才有效。他们要合作才可以
串行队列(Serial Dispatch Queue)只有一个线程,加入到队列中的操作按照添加到顺序依次执行(一个任务执行完毕后,再执行下一个任务)
。。。还有一个特殊的队列就是主队列,用来执行主线程的操作任务

执行队列中任务的两种方式

1.同步执行:只能在当前线程中执行任务,不具备开启新鲜程度能力
 // queue:队列, block:任务
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
2.异步执行:可以在新县城中执行任务,具备开启新线程的能力
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

采用GCD做多线程,可以抽象为两步

1.找到队列(主队列或串行队列或并发队列)
//这是找到了更新UI的主线程所在的队列
dispatch_queue_t mainQueue= dispatch_get_main_queue(); 

/*
  *  创建一个队列
  *  第一个参数:队列名字
  *  第二个参数:队列类类型
         并行队列:DISPATCH_QUEUE_CONCURRENT
         串行队列:DISPATCH_QUEUE_SERIAL
  *
  */
dispatch_queue_t serialQueue = dispatch_queue_create("mySerialQueue", DISPATCH_QUEUE_SERIAL);

/* 
  * 系统内部给我们提供有一个现成的并发队列
  * 第一个参数:线程的优先级, DISPATCH_QUEUE_PRIORITY_BACKGROUND是最低的。
  * 第二个参数:系统保留的参数,永远传0
  */
 dispatch_queue_t queue = dispatch_get_global_queue(0 , 0);
2.在队列中用同步或异步的方式执行任务
//这里采用的同步方式执行任务,sync是同步,async是异步
dispatch_sync(mainQueue, ^{  

});

加载一张图片实例

/**
     1、创建视图
     2、创建一个串行队列
     3、用异步方式执行串行队列中的任务
     4、加载网络资源
     */
// 1. 创建视图
    UIImageView *imageView = [[UIImageView alloc]initWithFrame:self.view.frame];
    [self.view addSubview:imageView];
// 2.创建一个串行队列
    dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue",DISPATCH_QUEUE_SERIAL);
// 3、用异步方式执行串行队列中的任务
    dispatch_async(serialQueue, ^{

// 4、加载网络资源
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString: @"http://download.pchome.net/wallpaper/pic-4345-2-640x1136.jpg"]];
        UIImage *image = [UIImage imageWithData:data];
// 5、回到主线程  dispatch_get_main_queue这个函数找到主队列
        dispatch_queue_t mainQueue = dispatch_get_main_queue();
        dispatch_sync(mainQueue, ^{

// 6、更新UI
       imageView.image = image;
        });
    });


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值