gcd学习理解(二)

来源:互联网 发布:工作淘宝客服怎么样 编辑:程序博客网 时间:2024/06/05 03:47

1.更新UI或者发送通知等操作注意回到主线程来执行。主队列只会在主线程中执行main_queue

2.dispatch_after函数最好在主队列执行

3.dispatch_once_t 类 和dispatch_once函数对单利创建提供了一个便捷的方式,dispatch_once() 以线程安全的方式执行且仅执行其代码块一次

4.处理读写者问题:
当一个线程正在读取时让另外一个线程修改数组就是不安全的,这就产生了读写者问题。
GCD 通过用 dispatch barriers 创建一个读者写者锁 提供了一个优雅的解决方案。dispatch barriers  是一组函数,使用 GCD 的障碍(barrier)API 确保提交的 Block 在那个特定时间上是指定队列上唯一被执行的条目。这就意味着所有的先于调度障碍提交到队列的条目必能在这个 Block 执行前完成。后提交的block也只能在这之后完成。

dispatch barriers最好在自定的并发队列中执行,dispatch_queue_create("wxy",DISPATCH_QUEUE_CONCURRENT);
  1.  dispatch_barrier_async(self.concurrentPhotoQueue, ^{ 
  2.             [_photosArray addObject:photo];
  3.             dispatch_async(dispatch_get_main_queue(), ^{ 
  4.                 [self postContentAddedNotification];  //改变数组信息
//获取数组
  1. - (NSArray *)photos 
  2.     __block NSArray *array;
  3.     dispatch_sync(self.concurrentPhotoQueue, ^{  
  4.         array = [NSArray arrayWithArray:_photosArray];
  5.     }); 
  6.     return array; 
//在实例队列里面添加改操作和读操作,不应该用串行队列(只有等一个值返回后再执行后续任务,这样就没有意义了),使用并发队列,不用等到一个任务执行完再执行另外一个任务。不能使用异步函数调用,这样可能写方法还没有返回,读方法已经结束了。

5.死锁问题

  

-(void)viewDidLoad{

   NSLog(@"hello");

   dispatch_queue_t mainQueue=dispatch_queue_create("wxy",DISPATCH_QUEUE_SERIAL);

   dispatch_sync(mainQueue, ^{

       NSLog(@"dddd");

    });

    NSLog(@"你好");

   NSLog(@"%@",mainQueue);

   NSLog(@"%@",dispatch_get_main_queue());

}//@1.先执行主队列的 NSLog(@"hello");

@2.执行“wxy”队列    NSLog(@"dddd");

@3.在执行主队列NSLog(@"你好");


如果你调用 dispatch_sync 并放在你已运行着的当前队列。这会导致死锁

-(void)viewDidLoad{

   NSLog(@"hello");

   dispatch_queue_t mainQueue=dispatch_get_main_queue();

   dispatch_sync(mainQueue, ^{

       NSLog(@"dddd");

    });

    NSLog(@"你好");

}

//    NSLog(@"你好");是先于添加的任务,是没法完成的,要等到添加到dispatch_sync中的block先完成,但是这个block也没法完成,所以导致了死锁、


6.队列与函数的关系 

-(void)viewDidLoad{

    NSLog(@"hello");

    dispatch_queue_t mainQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0);

    dispatch_async(mainQueue, ^{

        NSLog(@"1");

    });

    dispatch_sync(mainQueue, ^{

        sleep(1.0);

         NSLog(@"2");

    });

    dispatch_async(mainQueue, ^{

        NSLog(@"3");

    });

    dispatch_sync(mainQueue, ^{

        NSLog(@"4");

    });

     NSLog(@"你好");

    //mainqueue是一个全局队列,全局队列处理 dispatch_sync Block加入之前已经出现在队列中的任务,全局队列有并发处理的能力,如果碰到的是同步函数,则还是等待返回值后才能执行后面的,即使是在不同的队列中,不过如果把 dispatch_sync Block添加到当前运行的队列中,就会死锁!

//就是把同步函数任务或者异步函数任务添加到一个队列中,会有不同的执行顺序。

}






1 0
原创粉丝点击