iOS开发之多线程GCD

    GCD全称:(Grand Central Dispatch)是对多线程、多核开发较完整的封装。在使用GCD的时候,系统会自动根据CPU使用情况进行调度,所以GCD是一个简单易用,但是效果很好地多线程多核开发工具

一、GCD中有2个用来执行任务的函数

1、用同步的方式执行任务 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);

2、用异步的方式执行任务 dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

2.1.同步和异步的区别

(1)同步:在当前线程中执行

(2)异步:在另一条线程中执行

二、队列

1、GCD的队列可以分为2大类型

(1)并发队列(Concurrent Dispatch Queue)

可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)并发功能只有在异步(dispatch_async)函数下才有效

GCD默认已经提供了全局的并发队列,供整个应用使用,不需要手动创建

使用dispatch_get_global_queue函数获得全局的并发队列

dispatch_queue_t
dispatch_get_global_queue(long identifier, unsigned long flags);

示例:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 获得全局并发队列第二个参数为苹果预留写0即可

说明:全局并发队列的优先级

#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 // 后台

2、串行队列(Serial Dispatch Queue)

让任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务)

GCD中获得串行有2种途径

(1)使用dispatch_queue_create函数创建串行队列

 // 自定义dispatch_queue
        dispatch_queue_create(const char *label,  dispatch_queue_attr_t attr);// 队列名称, 队列属性,一般用NULL即可

示例:

<span style="white-space:pre">	</span> dispatch_queue_t spfqueue = dispatch_queue_create([@"myQueue" UTF8String], NULL);//创建

(2)使用主队列(跟主线程相关联的队列)

主队列是GCD自带的一种特殊的串行队列,放在主队列中的任务,都会放到主线程中执行

使用dispatch_get_main_queue()获得主队列

示例:

dispatch_queue_t queue = dispatch_get_main_queue();

三、总结:

<span style="white-space:pre">	</span>//  后台执行:
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            // something
        });
        
        // 主线程执行:
        dispatch_async(dispatch_get_main_queue(), ^{
            // something
        });
        
        // 一次性执行:
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            // code to be executed once
        });
        
        // 延迟2秒执行:
        double delayInSeconds = 2.0;
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            // code to be executed on the main queue after delay
        });
        
        // 自定义dispatch_queue_t
        dispatch_queue_t urls_queue = dispatch_queue_create("blog.devtang.com", NULL);
        dispatch_async(urls_queue, ^{
               // your code
        });
        
        // 合并汇总结果
        dispatch_group_t group = dispatch_group_create();
        dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
            // 并行执行的线程一
        });
        dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
            // 并行执行的线程二
        });
        dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{
            // 汇总结果
        });

四、GCD的另一个用处是可以让程序在后台较长久的运行。

在没有使用GCD时,当app被按home键退出后,app仅有最多5秒钟的时候做一些保存或清理资源的工作。但是在使用GCD后,app最多有10分钟的时间在后台长久运行。这个时间可以用来做清理本地缓存,发送统计数据等工作。

// AppDelegate.h文件
@property (assign, nonatomic) UIBackgroundTaskIdentifier backgroundUpdateTask;

// AppDelegate.m文件
- (void)applicationDidEnterBackground:(UIApplication *)application
{
    [self beingBackgroundUpdateTask];
    // 在这里加上你需要长久运行的代码
    [self endBackgroundUpdateTask];
}

- (void)beingBackgroundUpdateTask
{
    self.backgroundUpdateTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [self endBackgroundUpdateTask];
    }];
}

- (void)endBackgroundUpdateTask
{
    [[UIApplication sharedApplication] endBackgroundTask: self.backgroundUpdateTask];
    self.backgroundUpdateTask = UIBackgroundTaskInvalid;
}

五、dispatch_sync 和dispatch_async的区别

dispatch_sync(),同步添加操作。他是等待添加进队列里面的操作完成之后再继续执行。
dispatch_async ,异步添加进任务队列,它不会做任何等待

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值