GCD的一些简单使用

来源:互联网 发布:长期股权投资转换知乎 编辑:程序博客网 时间:2024/05/22 17:41

//创建一个多线程队列(并行和串行)
//串行
    dispatch_queue_t serialQueue = dispatch_queue_create("com.life.little kid serial",DISPATCH_QUEUE_SERIAL);

//并行
    dispatch_queue_t concurrentQueue = dispatch_queue_create("com.like.little gril",DISPATCH_QUEUE_CONCURRENT);

异步追加
    dispatch_async(serialQueue, ^{
       
NSLog(@"这是一个串行队列");
    });
同步追加(不到万不得已不要使用)
    dispatch_async(concurrentQueue, ^{
       NSLog(@"这是一个并行队列");
    });
   
/*
    
优先级
     *  - DISPATCH_QUEUE_PRIORITY_HIGH:         QOS_CLASS_USER_INITIATED
     *  - DISPATCH_QUEUE_PRIORITY_DEFAULT:      QOS_CLASS_DEFAULT
     *  - DISPATCH_QUEUE_PRIORITY_LOW:          QOS_CLASS_UTILITY
     *  - DISPATCH_QUEUE_PRIORITY_BACKGROUND:   QOS_CLASS_BACKGROUND
*/

   
//获取全局队列(并行)
   
dispatch_queue_t queue1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
   
   
//获取主队列,串行
    dispatch_queue_t mainQueue = dispatch_get_main_queue();


  //创建分组,监听队列中任务的执行
 
 
dispatch_group_t group =dispatch_group_create();
 
 
dispatch_queue_t queue =dispatch_get_global_queue(0, 0);
 
 
dispatch_group_async(group, queue, ^{
   
NSLog(@"1.洗菜");
  });
 
 
dispatch_group_async(group, queue, ^{
   
sleep(10);
   
NSLog(@"2.切菜");
  });
 
 
dispatch_group_async(group, queue, ^{
   
sleep(2);
   
NSLog(@"3.炒菜");
  });
 
 
dispatch_group_async(group, queue, ^{
   
NSLog(@"4.上菜");
  });
 
 
/*
  //所有任务执行完,会通知group
  dispatch_group_notify(group, queue, ^{
    //收尾的任务
    NSLog(@"吃菜");
  });
   */

 
 
//group到达某一个时间点,在时间点去查看任务执行的进度
 
//when,参照时间点
 
//delta,时间偏移量
 
 
dispatch_time_t time =dispatch_time(DISPATCH_TIME_NOW, 5 * NSEC_PER_SEC);
 
 
long result = dispatch_group_wait(group, time);//wait操作会阻塞当前的线程
 
if (result == 0) {
   
NSLog(@"任务执行完");
   
NSLog(@"吃菜");
  }
else {
   
NSLog(@"有些任务没有执行完");
  }
 

GCD apply 
 //第一个参数,迭代的次数
 
dispatch_apply(array.count,dispatch_get_global_queue(0, 0), ^(size_ti) { /*size_t i 迭代变量*/
   
NSNumber *num = array[i];
   
float f = [numfloatValue];
   
NSLog(@"%.4f", f);
  });

GCD实现单例

//ARC
定义一个类方法
+ (instancetype)sharedChairman {
 
 
static dispatch_once_t onceToken;
 
dispatch_once(&onceToken, ^{
   
//保证block中的代码,在整个App的生命周期中只执行一次
   
instance = [[superallocWithZone:nil]init];
  });
 
 
return instance;
}

- (
id)copy {
 
return self;
}

//防止alloc方法,创建一个新的对象
//alloc 方法会自动调用allocWithZone:nil
+ (
instancetype)allocWithZone:(struct_NSZone*)zone {
//  [super allocWithZone:zone]
 
return [selfsharedChairman];
}


起线程名字的时候需要使用bundle id 加上 _线程的属性(serial 和concurrent) 然后_线程数
0 0
原创粉丝点击