GCD的简单应用

导语:

每次提到多线程,iOS骚年总是说GCD(感觉有点高逼格)。当然,做的项目自然会接触到GCD,功能是挺强大的。博主这就不简述GCD是什么了(因为具体博主也不知道啦~),也不说dispatch_get_global_queuedispatch_get_main_queue,大家可以去百度下,很多资料,博主主要是对于应用做点简述。

一:延迟dispatch_after()

一般延迟操作的时候,dispatch_after是一个很好的方法,他可以做同步的延时,也可以异步的,用的比较多的是在用MJRefresh的时候:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{  

    [self getModelList];// 得到数据(做网络请求)
    
    [self.tableView.footer endRefreshing];   // (一般在数据请求结束后)调用endRefreshing可以结束刷新状态
    
     });

二:同时请求好多个网络请求后再做最后个网络请求(这种设计真的挺无奈的)或者数据库的操作。dispatch_group

dispatch_queue_t quete = dispatch_queue_create("XIAXIAQUEUE", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group = dispatch_group_create();

dispatch_group_enter(group);
dispatch_group_async(group, quete, ^{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        sleep(8);//假设需要八秒的网络请求

         NSLog(@"网络任务1完成");
        dispatch_group_leave(group);
    });
    NSLog(@"任务1完成");//可以做个区别
    
});

dispatch_group_enter(group);
dispatch_group_async(group, quete, ^{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        sleep(8);

        NSLog(@"网络任务2完成");
         dispatch_group_leave(group);
    });
            NSLog(@"任务2完成");
   
});
dispatch_group_notify(group, quete, ^{
    NSLog(@"最后执行");
});

大功告成啦,O(∩_∩)O哈哈~ 这边运用了dispatch_group_enter()dispatch_group_leave()两个方法,用来表示它从group中完成了,如果没有的话,会先执行notify力的方法。

三:倒计时

当我们做个短信倒计时的时候,也可以用GCD做(有木有感觉很强大~)。
- (void)daojishi{

__block int timeout = 60; //倒计时时间
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(), ^{
             [_getYzmButton setTitle:@"获取验证码" forState:UIControlStateNormal];
             _getYzmButton.enabled = YES;
         });
    }
    else
    {
        int seconds = timeout;
        NSString *strTime = [NSString stringWithFormat:@"%.2d秒后重新获取", seconds];
        dispatch_async(dispatch_get_main_queue(), ^{
            [_getYzmButton setTitle:strTime forState:UIControlStateNormal];
            _getYzmButton.enabled = NO;
        });
        
        timeout--;
    }
});
dispatch_resume(_timer);
}

结束语

欢迎各位小伙伴一起学习探讨哦~ 写写收看~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 工作中遇到复杂度高的项目系统,我惯于花时间梳理出大手稿,作为参考,根据这个思路,我花时间对于OC底层的机制进行梳理...
    扬仔360阅读 443评论 0 3
  • 1、主线程队列 VS 分线程队列 dispatch_sync 和 dispatch_async 区别: dispa...
    瑞小萌阅读 998评论 4 7
  • 1.耗时操作通常我们需要做耗时操作的时,可以直接使用下面代码,GCD会自动帮我们创建线程进行处理 2.阻塞式(有先...
    ___1o_8o阅读 274评论 0 0
  • 准备躺下了,突然发现还有一个多小时就到12月15日了,又一次忘了妈妈的受难日。记得小时候妈妈常说,生下我的时候是冬...
    海加尔山的歌声阅读 416评论 0 1
  • “一千四百年来,我东玄遭逢百六阳九,四劫八难。靠什么,靠的是东玄派弟子的努力,也靠的是东玄派弟子的运气。紫霄殿里钟...
    公子旷阅读 395评论 0 2

友情链接更多精彩内容