iOS GCD使用

记录我工作中使用到的GCD方法,定期更新完善。
Grand Central Dispatch (GCD) 是Apple开发的一个多核编程的较新的解决方法。

  1. GCD可用于多核的并行运算
  2. GCD会自动利用更多的CPU内核(比如双核、四核)
  3. GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)

程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码。但是看了很多文章,感觉GCD太大了,根本就记不住,所以写下这个笔记,记录下自己使用到的方法。

  1. 同时执行多个异步操作,都执行完毕,再执行某个方法。
    // 创建信号量
    _semaphore = dispatch_semaphore_create(0);
   // 创建全局并行
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, queue, ^{
        // 请求一
        //获取轮播图数据
        [self getCarouselData];
    });
    dispatch_group_async(group, queue, ^{
        // 请求二
        //获取首页 3 和 8 张图
        [self getTemplateImg];
    });
    dispatch_group_notify(group, queue, ^{
        // 2个请求对应2次信号等待
        dispatch_semaphore_wait(_semaphore, DISPATCH_TIME_FOREVER);
        dispatch_semaphore_wait(_semaphore, DISPATCH_TIME_FOREVER);
        //回到主线程刷新ui
        dispatch_async(dispatch_get_main_queue(), ^{
            DLog(@"------------  请求完毕 ---------------");

            [self.tableView reloadData];
            [self.tableView.mj_header endRefreshing];
        });
    });

在请求方法获取到数据时

   //[self getCarouselData];
   DLog(@"------------ 第一次 请求完毕 ---------------");
   dispatch_semaphore_signal(_semaphore);
  1. GCD进行延迟操作
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{        
        [self.navigationController popViewControllerAnimated:YES];
    });
  1. GCD倒计时
    __block int timeout= 59; //倒计时时间
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
    dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行
    dispatch_source_set_event_handler(_timer, ^{
        if(timeout<=0){ //倒计时结束,关闭
            dispatch_source_cancel(_timer);
            dispatch_async(dispatch_get_main_queue(), ^{
                //设置界面的按钮显示 根据自己需求设置
                [self.getCode setTitle:@"获取验证码" forState:UIControlStateNormal];
                self.getCode.userInteractionEnabled = YES;
            });
        }else{
            //            int minutes = timeout / 60;
            int seconds = timeout % 120;
            NSString *strTime = [NSString stringWithFormat:@"%.2d", seconds];
            dispatch_async(dispatch_get_main_queue(), ^{
                //设置界面的按钮显示 根据自己需求设置
                [self.getCode setTitle:[NSString stringWithFormat:@"%@秒后重获",strTime] forState:UIControlStateNormal];
                self.getCode.userInteractionEnabled = NO;
            });
            timeout--;
        }
    });
    dispatch_resume(_timer);

4.异步操作,主线程刷新UI

            dispatch_async(dispatch_get_global_queue(0, 0), ^{
                //通知主线程刷新
                dispatch_async(dispatch_get_main_queue(), ^{
                    //回调或者说是通知主线程刷新,
                    [self.mTableView reloadData];;
                });
            });

5.调度组

//1.创建调度组
    dispatch_group_t group = dispatch_group_create();
    //2.队列
    dispatch_queue_t q = dispatch_get_global_queue(0, 0);
    //3.调度组监听队列
    dispatch_group_enter(group);
    dispatch_group_async(group, q, ^{
        sleep(1);
        NSLog(@"download 1");
        dispatch_group_leave(group);
    });
    dispatch_group_enter(group);
    dispatch_group_async(group, q, ^{
        NSLog(@"download 2");
        dispatch_group_leave(group);
    });
    dispatch_group_notify(group, q, ^{
        NSLog(@"完成");
    });

你可能感兴趣的:(iOS GCD使用)