iOS中的串行,并行,分组,一次,障碍,延迟,反复执行(GCD)

#import "OneViewController.h"

@interface OneViewController ()

@end

@implementation OneViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark 方法
//依靠C语言来执行,效率最高

//串行队列
- (IBAction)serialBtn:(id)sender {
    //1.创建行对列

    //1.获取系统创建好的串行对列,在主线程中是实现线程同步
    dispatch_queue_t queue1 = dispatch_get_main_queue();

    //2.自己创建串行队列,任务在子线程中实现线程同步
    dispatch_queue_t queue2 = dispatch_queue_create("com.lanou3g.oa", DISPATCH_QUEUE_SERIAL); //字符串 -- 唯一标示的作用(反域名形式),DISPATCH_QUEUE_SERIAL -- 指定为串行
    //2.往队列中添加任务
    dispatch_async(queue2, ^{
        NSLog(@"任务一:%@",[NSThread currentThread]);

    });
    dispatch_async(queue2, ^{
        NSLog(@"任务二:%@",[NSThread currentThread]);

    });
    dispatch_async(queue2, ^{
        NSLog(@"任务三:%@",[NSThread currentThread]);

    });
    dispatch_async(queue2, ^{
        NSLog(@"任务四:%@",[NSThread currentThread]);

    });

    //释放
    dispatch_release(queue2);

}

//并行(并发)队列
- (IBAction)parallelBtn:(id)sender {
    //1.创建并发队列,系统创建好了四个
    //1.使用系统创建好的并发队列
    dispatch_queue_t queue1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 参数分别是:优先级,预留参数
    //2.自己创建并发队列
    dispatch_queue_t queue2 = dispatch_queue_create("com.lanou3g.oa", DISPATCH_QUEUE_CONCURRENT); // 参数1.唯一标示,参数二 指定为并发队列

    //3.往队列中添加任务
    dispatch_async(queue2, ^{
        NSLog(@"任务1: %@",[NSThread currentThread]);
    });

    dispatch_async(queue2, ^{
        NSLog(@"任务2: %@",[NSThread currentThread]);
    });
    dispatch_async(queue2, ^{
        NSLog(@"任务3: %@",[NSThread currentThread]);
    });
    dispatch_async(queue2, ^{
        NSLog(@"任务4: %@",[NSThread currentThread]);
    });
    //请求图片
    //跳转到主线程刷新界面
    dispatch_async(dispatch_get_main_queue(),^{
    //更新 UI 显示图片

    });
    //释放
    dispatch_release(queue2);

}

//分组任务
- (IBAction)groupBtn:(id)sender {
    //1.创建并行队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //2.创建分组
    dispatch_group_t group = dispatch_group_create();
    //3.方分组中添加任务
    dispatch_group_async(group, queue, ^{
        NSLog(@"任务一,请求 0 - 20 M数据");
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"任务二,请求 0 - 20 M数据");
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"任务三,请求 0 - 20 M数据");
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"任务四,请求 0 - 20 M数据");
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"任务五,请求 0 - 20 M数据");
    });
    //4.当分组内的所有任务完成之后,拼接操作
    dispatch_group_notify(group, queue, ^{
        NSLog(@"拼接数据吧!");
    });
    //释放
    dispatch_release(group);
}
//一次
- (IBAction)oneBtn:(id)sender {
}
//障碍
- (IBAction)obstacleeBtn:(id)sender {
    //障碍任务的作用:可以保证障碍之后的并发的任务,必须在障碍之前的并发的任务执行结束之后,才可以开始执行
    //注意:要添加障碍任务,必须要使用自己创建的并发队列.
    //创建并发队列
     dispatch_queue_t queue = dispatch_queue_create("com.lanou.3g.oa",DISPATCH_QUEUE_CONCURRENT);
    //往队列中添加任务
    dispatch_async(queue, ^{
        NSLog(@"A写入文件");
    });
    dispatch_async(queue, ^{
        NSLog(@"B写入文件");
    });
    dispatch_async(queue, ^{
        NSLog(@"C写入文件");
    });
    dispatch_async(queue, ^{
        NSLog(@"D写入文件");
    });
    //添加(设置)障碍任务
    dispatch_barrier_async(queue, ^{
        NSLog(@"此处是障碍任务");
    });
    dispatch_async(queue, ^{
        NSLog(@"读取文件");
    });
    //释放
    dispatch_release(queue);
}
//延迟
- (IBAction)delayBtn:(id)sender {
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"5秒,五秒");

    }); //dispatch_get_main_queue 在主线程中执行,如果想要在子线程中执行,此处改为子线程即可

}

//反复执行
- (IBAction)diReceiveMemoryBtn:(id)sender {
//    dispatch_apply(10, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t index) {
//        NSLog(@"反复执行的次数:%ld,当前线程%@",index,[NSThread currentThread]);
//    });

    dispatch_apply(10, dispatch_get_main_queue(), ^(size_t index) {
        NSLog(@"反复执行的次数:%ld,当前线程%@",index,[NSThread currentThread]);
    });
}@end

//单例

#import "Singleton.h"

@implementation Singleton
//+ (id)mainSingleton{
//    static Singleton *single = nil;
//    @synchronized(self){
//        if(!single){
//            single = [[Singleton alloc] init];
//        }
//
//    }
//    return single;
//}

+ (id)mainSingleton{
static Singleton *single = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    //写只执行一次的代码
    single = [[Singleton alloc] init];
});

return single;
}
时间: 2024-10-14 04:35:30

iOS中的串行,并行,分组,一次,障碍,延迟,反复执行(GCD)的相关文章

IOS多线程知识总结/队列概念/GCD/串行/并行/同步/异步

进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间: 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程. 队列:dispatch_queue_t,一种先进先出的数据结构,线程的创建和回收不需要程序员操作,由队列负责. 串行队列:队列中的任务只会顺序执行(类似跑步) dispatch_queue_t q = dispatch_queue_create(“....”, dispatch_queue_serial); 并

iOS多线程——同步异步串行并行

串行并行异步同步的概念很容易让人混淆,关于这几个概念我在第一篇GCD中有解释,但是还不够清晰,所以这里重写一篇博客专门对这几个概念进行区分: 先说一下队列和任务: (1)队列分为串行和并行,任务的执行分为同步和异步,异步是多线程的代名词,异步在实际引用中会开启新的线程,执行耗时操作. (2)队列只是负责任务的调度,而不负责任务的执行,任务是在线程中执行. 以上两点对了解串行.并行.同步.异步非常重要! 再说一下队列和任务的特点: (1)串行队列:任务按照顺序被调度,前一个任务不执行完毕,队列不会

【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例(转载)

(1)GCD实现的同步异步.串行并行. ——同步sync应用场景:用户登录,利用阻塞 ——串行异步应用场景:下载等耗时间的任务 /** * 因为是异步,所以开通了子线程,但是因为是串行队列,所以只需要开通1个子线程(2),它们在子线程中顺序执行.最常用. */ -(void)gcdDemo1{ dispatch_queue_t q1=dispatch_queue_create("com.hellocation.gcdDemo", DISPATCH_QUEUE_SERIAL); for

GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例

转:http://www.tuicool.com/articles/NVVnMn (1)GCD实现的同步异步.串行并行. ——同步sync应用场景:用户登录,利用阻塞 ——串行异步应用场景:下载等耗时间的任务 /** * 因为是异步,所以开通了子线程,但是因为是串行队列,所以只需要开通1个子线程(2),它们在子线程中顺序执行.最常用. */ -(void)gcdDemo1{ dispatch_queue_t q1=dispatch_queue_create("com.hellocation.gc

FS BPM 业余研发(用户详细操作手册--单人串行/并行)之 深圳分公司技术部请假审批流程

1.FS BPM 简介 BPM软件中BPM是英文字母缩写,大致有二个意思.第一.Business Process Management,即业务流程管理,是一套达成企业各种业 务环节整合的全面管理模式.第二.Business Process Modeling,即业务流程建模,是对业务流程进行表述的方式,它是过程分析与重组的 重要基础. 如果再不了解请自行百度了,本人在这里就不再详细介绍了. 2.FS BPM 系统开发介绍 FS BPM于2017年1月开始进行开发.其中经历多个难题.用高性能机制解决

数据库并发中的串行化

目前关系型数据库大多数情况都采用弱模型,由此引发的是并发时的隔离性混乱,通常解决方案是给数据库加乐观锁或悲观锁.只有少数个别的关系型数据库会给数据库事务加上串行化,但是需要注意是的是这样做虽然能够解决一些并发问题,但是相应的代价是并发时性能的降低以及少量死锁. 参考解道博文:http://www.jdon.com/47401

【iOS面试系列-2】多线程中同步、异步和串行、并行之间的逻辑关系(必考,必须掌握)

一.同步.异步和串行.并行 任务串行执行就是每次只有一个任务被执行,任务并发执行就是在同一时间可以有多个任务被执行. 一个同步函数只在完成了它预定的任务后才返回.一个异步函数,刚好相反,会立即返回,预定的任务会完成但不会等它完成.因此,一个异步函数不会阻塞当前线程去执行下一个函数. (来源:http://www.cocoachina.com/industry/20140428/8248.html) 队列分为串行和并行 任务的执行分为同步和异步 -------  队列只是负责任务的调度,而不负责任

IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别(附代码)

进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程 队列 dispatch_queue_t,队列名称在调试时辅助,无论什么队列和任务,线程的创建和回收不需要程序员操作,有队列负责. 串行队列:队列中的任务只会顺序执行(类似跑步) dispatch_queue_t q = dispatch_queue_create(“....”, DISPATCH_QUEUE_SER

ios--进程/多线程/同步任务/异步任务/串行队列/并行队列(对比分析)

现在先说两个基本的概念,啥是进程,啥是线程,啥又是多线程;先把这两个总是给弄清再讲下面的 进程:正在进行的程序,我们就叫它进程. 线程:线程就是进程中的一个独立的执行路径.这句话怎么理解呢! 一个程序它是按顺序从上往下执行的, 这个执行顺序我们可以把它看成是一条线,把这条线就叫做线程(个人理解,错了勿喷);每一个程序中至少包含一条线程, 这条线程,我们叫它主线程. 多线程:多线程也就是说一个程序中有多条执行路径.在iOS当中将一些比较耗时的操作放到另一条执行路径里.让它与主线程同时运行.这样不会