美文网首页
iOS中的函数与队列

iOS中的函数与队列

作者: Bel李玉 | 来源:发表于2020-11-05 16:52 被阅读0次

本篇文章中我们主要讲解GCD中的函数。

GCD

GCDGrand Central Dispatch的简称,纯c语言,提供了非常多强大的函数,将任务添加到队列,并且指定执行任务的函数

函数

  • 1,GCD中的函数使用block封装,任务的block没有参数也没有返回值。
  • 2,异步函数dispatch_async: 不用等待当前语句执行完毕,就可以执行下一条语句,会开启线程执行block的任务。
  • 3,同步函数dispatch_sync,必须等待当前语句执行完毕,才会执行下一条语句,不会开启线程,在当前执行block的任务。

函数与队列

同步函数串行队列
  • 1,不会开启线程,在当前线程执行任务。
  • 2,任务串行执行,任务一个接着一个。
  • 3,会产生堵塞。
同步函数并发队列
  • 1,不会开启线程,在当前线程执行任务。
  • 2,任务一个接着一个执行。
异步函数串行队列
  • 1,开启一条新线程
  • 2,任务一个接着一个执行。
异步函数并发对列
  • 1,开启线程,在当前线程执行任务。
  • 2,任务异步执行,没有顺序,与CPU调度有关。

dispatch_sync

dispatch_sync函数,如果 dispatch_sync()目标queue当前queue,且 当前queue为串行队列时,会发生死锁(并行queue并不会)。
下面我们通过下面的几个函数示例来验证一下:

- (void)viewDidLoad {
    [super viewDidLoad];
    [self mainSyncTest];
}
- (void)mainSyncTest{
    NSLog(@"0");
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"1");
    });
    NSLog(@"2");
}
  • 主线程中调用dispatch_sync函数,且 目标queue,为主线程,住线程是一个串行队列,所以会造成死锁
- (void)test1{
    dispatch_queue_t queue = dispatch_queue_create("LY", NULL);
    NSLog(@"1");
    // 异步函数
    dispatch_async(queue, ^{
        NSLog(@"2");
        // 同步
        dispatch_sync(queue, ^{
            NSLog(@"3");
        });
         NSLog(@"4");
    });
    NSLog(@"5");
}

- (void)test2 {
    dispatch_queue_t queue1 = dispatch_queue_create("LY", NULL); // 串行队列
    dispatch_queue_t queue2 = dispatch_queue_create("Nice", NULL); // 串行队列
       NSLog(@"1");
       // 异步函数
       dispatch_async(queue1, ^{
           NSLog(@"2");
           // 同步
           dispatch_sync(queue2, ^{
               NSLog(@"3");
           });
            NSLog(@"4");
       });
       NSLog(@"5");
}
  • test1 函数,目标queue当前queue,并且都为串行队列,会导致死锁
  • test2 函数,dispatch_sync当前queuequeue1目标queuequeue2,因为queue1和queue2不是同一个队列,不会造成死锁。
-(void) test3 {
    dispatch_queue_t queue = dispatch_queue_create("LY", DISPATCH_QUEUE_CONCURRENT);
    NSLog(@"1");
    dispatch_async(queue, ^{
        NSLog(@"2");
        dispatch_sync(queue, ^{
            NSLog(@"3");
        });
        NSLog(@"4");
    });
    NSLog(@"5");
}
  • test3 函数,dispatch_sync函数的当前queue目标queue为同一个queue。但该队列为并发队列,并不会造成死锁。

最后,奉上本文的代码示例 GCD

相关文章

  • iOS中的函数与队列

    本篇文章中我们主要讲解GCD中的函数。 GCD GCD是Grand Central Dispatch的简称,纯c语...

  • iOS函数与队列

    1 GCD 介绍 全称是 Grand Central Dispatch,也简称 Dispatch; 纯 C 语言,...

  • iOS开发多线程篇—GCD介绍(转)

    iOS开发多线程篇—GCD介绍 用异步函数往并发队列中添加任务--同时开启三个子线程 用异步函数往串行队列中添加任...

  • GCD实现线程同步的方法

    在iOS多线程中我们知道NSOperationQueue操作队列可以直接使用addDependency函数设置操作...

  • iOS Objective-C GCD之函数篇

    iOS Objective-C GCD之函数篇 1. GCD 中函数简介 在上一篇队列篇中我们简要的介绍了GCD中...

  • [iOS] GCD - 函数与队列

    1. GCD 1.1 简介 GCD (Grand Central Dispatch),纯 C 语言。 会自动利用更...

  • YYLable异步渲染在绘图中的应用

    方法及关键函数解释 iOS8之前和之后设置线程队列优先级及层次体系,让不同队列中的任务同步的执行时iOS8 之前需...

  • iOS多线程-GCD之同步和异步

    上一篇 iOS多线程-GCD之串行队列和并行队列 在GCD中,同步和异步是由这两个函数来完成的:dispatch_...

  • iOS 队列与线程

    队列和线程是在iOS开发中不可避免的,那么队列与线程有哪些关系呢? 给队列添加任务有四种方式:串行队列中执行同步任...

  • iOS开发-10.多线程

    1.iOS中的常见多线程方案image 2.GCD的常用函数 3.GCD的队列 4.容易混淆的术语 5.各种队列的...

网友评论

      本文标题:iOS中的函数与队列

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