GCD的简单应用

作者: __夏至未至 | 来源:发表于2016-04-22 14:52 被阅读121次

导语:

每次提到多线程,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);
}

结束语

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

相关文章

  • GCD的简单应用

    1.耗时操作通常我们需要做耗时操作的时,可以直接使用下面代码,GCD会自动帮我们创建线程进行处理 2.阻塞式(有先...

  • GCD的简单应用

    导语: 每次提到多线程,iOS骚年总是说GCD(感觉有点高逼格)。当然,做的项目自然会接触到GCD,功能是挺强大的...

  • GCD 的简单应用 Swift

    获取 GCD 的 queue 的引用,GCD 不是基于面向对象,还是基于 Function。 拥有了 queue,...

  • 13 个 GCD 应用场景

    13 个 GCD 应用场景 13 个 GCD 应用场景

  • 源码剖析:探究 Repeat 中 GCD 的应用

    源码剖析:探究 Repeat 中 GCD 的应用源码剖析:探究 Repeat 中 GCD 的应用

  • 【转载XMG】GCD的简单应用

  • GCD介绍

    一、GCD简单介绍 什么是GCD GCD优势 任务和队列 GCD有2个核心概念 GCD的使用就2个步骤 将任务添加...

  • iOS多线程,GCD的了解及实现

    什么是GCD,关于GCD的简单概念 其实多线程这个东西,GCD(Grand Central Dispatch),纯...

  • 多线程之GCD

    本文介绍什么是GCD 、 GCD的优势有哪些、GCD到底是什么?、 CGD的实际应用 下面开始详细解析 1.什么是...

  • iOS Objective-C GCD 应用篇

    iOS Objective-C GCD 应用篇 本文主要对GCD中的dispatch_semaphore(信号量)...

网友评论

    本文标题:GCD的简单应用

    本文链接:https://www.haomeiwen.com/subject/bakxrttx.html