美文网首页
iOS-GCD常用函数和栅栏函数

iOS-GCD常用函数和栅栏函数

作者: 长衣貌 | 来源:发表于2018-06-30 09:45 被阅读0次

GCD常用函数

//  ViewController.m
//  4.16-GCD常用函数
//
//  Created by 裴铎 on 2018/4/16.
//  Copyright © 2018年 裴铎. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    [self once];
}
/** 延期函数 */
- (void)delay{
    
    //为例验证 打印开始时间
    NSLog(@"start");
    
    //1./延时执行的方法
    [self performSelector:@selector(task) withObject:nil afterDelay:2.0];
    
    //2./延时执行的方法 最后一个参数是:是否重复
    [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(task) userInfo:nil repeats:NO];
    
    //3./延时执行的方法GCD
    //dispatch_queue_t queue = dispatch_get_main_queue();
    //获取全局并发队列 默认的优先级
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    /**
     参数
     1./重什么时间开始延迟 DISPATCH_TIME_NOW现在 DISPATCH_TIME_FOREVER未来
     2./延迟多少时间(delayInSeconds) 填写秒数 * 1000000000纳秒(NSEC_PER_SEC)GCD中时间是以纳秒计算
     3./在哪一个队列中执行 dispatch_get_main_queue() 可以是子线程 这个是别的方法没有的
     4./填写要执行的任务
     想让延迟任务在子线程中执行只传入一个并发队列就可以了
     */
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), queue, ^{
        //在这个block中写要执行的任务
        NSLog(@"当前线程:%@ 任务:%s",[NSThread currentThread],__func__);
    });
}
/** 一次性代码
 整个应用程序的生命周期中只会执行一次的
 一次性带么不能放在懒加载中使用,用了你第二次取值时就为空了
 一次性代码主要用在单利模式中 并且 是检查线程安全的(原子性)*/
- (void)once{
    NSLog(@"%s",__func__);
   
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSLog(@"__once__");
    });
}
/** 任务 */
- (void)task{
    
    NSLog(@"当前线程:%@ 任务:%s",[NSThread currentThread],__func__);
}
@end

GCD栅栏函数

//  ViewController.m
//  4.16-GCD栅栏函数
//
//  Created by 裴铎 on 2018/4/16.
//  Copyright © 2018年 裴铎. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    //获得一个默认优先级的全局并发队列
    //dispatch_queue_t queue = dispatch_get_global_queue(0, 0  );
    //如果有栅栏函数的话必须使用自己创建的并发队列
    dispatch_queue_t queue = dispatch_queue_create("peiDuo", DISPATCH_QUEUE_CONCURRENT);
    //创建异步函数
    dispatch_async(queue, ^{
        NSLog(@"           任务1:%@",[NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"           任务2:%@",[NSThread currentThread]);
    });
    
    //创建一个栅栏函数 栅栏函数之前的任务并发执行,完成后执行栅栏任务,完成后并发执行栅栏函数之后的任务
    dispatch_barrier_async(queue, ^{
        
        NSLog(@"           ++++++++++++++++ 这是一个栅栏 +++++++++++++++");
    });
    
    dispatch_async(queue, ^{
        NSLog(@"           任务3:%@",[NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"           任务4:%@",[NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"           任务5:%@",[NSThread currentThread]);
    });
}
@end

相关文章

  • iOS-GCD常用函数和栅栏函数

    GCD常用函数 GCD栅栏函数

  • 学习OC

    1.函数和队列的区别?同步函数和异步函数的区别?串行队列和并行队列的区别?什么是栅栏函数 且有什么注意点? 栅栏方...

  • GCD栅栏函数, 快速迭代和调度组的使用

    今天介绍几个比较重要的GCD函数: GCD栅栏函数: 同步栅栏函数: 会发生阻塞 异步栅栏函数: 不会发生阻塞 栅...

  • 多线程之GCD栅栏函数,GCD快速迭代,队列组

    1. GCD栅栏函数 作用:只有当栅栏函数执行完毕后才能执行后面的函数 需求:使用栅栏函数规定线程执行顺序 注意点...

  • GCD的栅栏函数的原理及使用

    什么是栅栏函数 在GCD中的栅栏函数有dispatch_barrier_async(异步)和dispatch_ba...

  • GCD的栅栏函数

    作用:只有当栅栏函数执行完毕后才能执行后面的函数 需求:使用栅栏函数规定线程执行顺序 注意点:栅栏函数不能使用全局...

  • 栅栏函数

    GCD中有两个用来执行任务的常用函数 用同步方法执行任务,其中 queue 是队列,block 是任务 dispa...

  • 栅栏函数

    需要用自定义并发队列 dispatch_barrier_sync(queue,void(^block)())会将q...

  • 多线程网络02

    1 GCD栅栏函数 栅栏函数用户控制队列里异步函数的的执行顺序。注:栅栏函数不能使用全局并发队列,需要用自己创建的...

  • 栅栏函数与迭代函数

    一, 栅栏函数 二,迭代函数

网友评论

      本文标题:iOS-GCD常用函数和栅栏函数

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