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.gcdDemo", DISPATCH_QUEUE_SERIAL);
  for (int i=0; i<10; i++) {
    dispatch_async(q1, ^{
      NSLog(@"%@",[NSThread currentThread]);
    });
  }
}
/**
 *  因为是异步,所以开通了子线程,且因为是并行队列,所以开通了好多个子线程,具体几个,无人知晓,看运气。线程数量无法控制,且浪费。
 */
-(void)gcdDemo2{
  dispatch_queue_t q2=dispatch_queue_create("com.hellocation.gcdDemo", DISPATCH_QUEUE_CONCURRENT);
  for (int i=0; i<10; i++) {
    dispatch_async(q2, ^{
      NSLog(@"%@",[NSThread currentThread]);
    });
  }
}
/**
 *  因为是同步,所以无论是并行队列还是串行队列,都是在主线程中执行
 */
-(void)gcdDemo3{
  dispatch_queue_t q1=dispatch_queue_create("com.hellocation.gcdDemo", DISPATCH_QUEUE_SERIAL);
  for (int i=0; i<10; i++) {
    dispatch_sync(q1, ^{
      NSLog(@"%@",[NSThread currentThread]);
    });
  }
}
/**
 *  全局队列和并行队列类似(全局队列不需要创建直接get即可,而导致其没有名字,不利于后续调试)
 */
-(void)gcdDemo5{
  dispatch_queue_t q=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
  for (int i=0; i<10; i++) {
    dispatch_sync(q, ^{
      NSLog(@"%@",[NSThread currentThread]);
    });
  }
  for (int i=0; i<10; i++) {
    dispatch_async(q, ^{
      NSLog(@"%@",[NSThread currentThread]);
    });
  }
}
/**
 *  因为是主线程,所以异步任务也会在主线程上运行(1)。而如果是同步任务,则阻塞了,因为主线程一直会在运行,所以后米的任务永远不会被执行。
 *  主要用处,是更新UI,更新UI一律在主线程上实现
 */
-(void)gcdDemo6{
  dispatch_queue_t q=dispatch_get_main_queue();
  for (int i=0; i<10; i++) {
    dispatch_sync(q, ^{
      NSLog(@"%@",[NSThread currentThread]);
    });
  }
//	for (int i=0; i<10; i++) {
//		dispatch_async(q, ^{
//			NSLog(@"%@",[NSThread currentThread]);
//		});
//	}
}

(2)NSOperation和NSOperationQueue实现的线程管理

/**
 *  1、只要是自己创建的队列,添加进来的操作(此处是block操作),都在子线程上(2)
 *  2、只要是在主队列中,添加进来的操作,都在主线程上(1)
 *  两个队列不能同时抢一个任务操作
 */
-(void)opDemo1{
  NSOperationQueue *queue=[[NSOperationQueue alloc]init];
  NSBlockOperation *b=[NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"%@",[NSThread currentThread]);
  }];
  [queue addOperation:b];
  [[NSOperationQueue mainQueue]addOperation:b];
}
/**
 *  同上
 */
-(void)opDemo2{
  NSInvocationOperation *i=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(helloWorld) object:nil];
  NSOperationQueue *queue=[[NSOperationQueue alloc]init];
  [queue addOperation:i];
  [[NSOperationQueue mainQueue]addOperation:i];
}
-(void)helloWorld{
  NSLog(@"hello,world!");
}
/**
 *  依赖关系:(1)可以保证执行顺序,也使得开的子线程不会太多;(2)可以跨队列,而串行是不可以跨队列的,如最后更新UI则变成在主队列中。
 *  这是NSOperation(NSBlockOperation和NSInvocationOperation)和NSOperationQueue的优势
 */
-(void)opDemo3{
  NSBlockOperation *op1=[NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"下载图片 %@",[NSThread currentThread]);
  }];
  NSBlockOperation *op2=[NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"修饰图片 %@",[NSThread currentThread]);
  }];
  NSBlockOperation *op3=[NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"保存图片 %@",[NSThread currentThread]);
  }];
  NSBlockOperation *op4=[NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"更新UI %@",[NSThread currentThread]);
  }];
  [op4 addDependency:op3];
  [op3 addDependency:op2];
  [op2 addDependency:op1];
  NSOperationQueue *queue=[[NSOperationQueue alloc]init];
  //设置同一时刻最大开启的线程数,这是NSOperationQueue特有的
  [queue setMaxConcurrentOperationCount:2];
  [queue addOperation:op1];
  [queue addOperation:op2];
  [queue addOperation:op3];
  [[NSOperationQueue mainQueue]addOperation:op4];
}

(3)单例的实现(手写单例要求)dispatch_once运用,即重写类的allocWithZone方法

@implementation WPObject
+(instancetype)allocWithZone:(struct _NSZone *)zone{
  static WPObject *insta;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    insta=[super allocWithZone:zone];
  });
  return insta;
}
@end
时间: 2024-10-14 12:14:13

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

【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

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

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

同步,异步,串行队列,并发队列,全局队列,主队列等概念的总结

同步,异步,串行队列,并发队列,全局队列,主队列等概念的总结 在GCD函数中, 我们常常碰到同步,异步,串行队列,并发队列,全局队列,主队列等概念,而这些概念又常常组合在一起, 十分头疼, 这篇文章就来梳理一下这些烦人的概念. 不想看长篇大论的, 直接看文章末尾的表格即可! 在此之前, GCD中还涉及到两个十分重要的概念, 就是任务和队列 任务(Task): 你需要执行的操作 队列(Queue): 存放任务的容器 GCD中两个重要的函数, 一个同步执行, 一个异步执行 dispatch_asyn

5.USART异步串行口输入输出(轮询模式)

学习是一个简单的过程,只要有善于发掘的眼睛,总能学到新知识,然而如何坚持不懈的学习却很困难,对我亦如此,生活中有太多的诱惑,最后只想说一句勿忘初心.闲话不多扯,本篇讲诉的是异步串行口的输入输出,串口在外设中属于比较简单的通讯模式,但是在大型项目调试中又十分重要,理解该外设模块对于以后的通讯协议学习以及软件调试都有重要意义. 通讯协议是指双方实体完成通信或服务所必须遵循的规则和约定,对于串口来说,包含波特率,数据位长度,停止位和数据校验位,当stm32芯片和客户端具有相同的协议约定时即能够正确的接

使用GCD的dispatch_once创建单例

使用GCD的dispatch_once创建单例 介绍了创建单例的方式,不过后来发现其实在ios 4.0后有更加简单的方式. 就是使用GCD的功能 代码如下: + (instantClass *)sharedClient { static instantClass *_sharedClient = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _sharedClient = [[instantClass al

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

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

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 didRece

IOS GCD(线程的 串行、并发 基本使用)

// 凡是函数名种带有create\copy\new\retain等字眼, 都需要在不需要使用这个数据的时候进行release // GCD的数据类型在ARC环境下不需要再做release // CF(Core Foundation)的数据类型在ARC环境下还是需要再做release @implementation HMViewController - (void)viewDidLoad { [super viewDidLoad]; [self performSelectorInBackgrou

python 同步异步,并发并行,同步锁

并发:系统具有处理多个任务(动作)的能力 并行:系统具有同时处理多个任务(动作)的能力 同步:当进程执行到一个IO(等待外部数据)的时候,需要等待,等待即同步 异步:当进程执行到一个IO(等待外部数据)的时候,不需要等待,待数据接收成功后,再回来处理. GIL:全局解释锁:无论你有多少个线程,你有多少个CPU,Python在执行的时候会淡定的在同一时刻只允许一个线程运行.(解释器层面保护进程安全) GIL的作用:同一时刻,只有一个线程被CPU在执行,造成单线程运行结果,多核用不到. 垃圾回收机制