区块链技术博客
www.b2bchain.cn

GCD面试要点求职学习资料

本文介绍了GCD面试要点求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

GCD在iOS中应该是最常使用的并发编程技术了,GCD接口设计得很简洁,使用起来也很方便,由于苹果做了高度的封装,所以很多人对GCD的原理并不是很了解,本文来总结一下GCD常用面试要点。

  • 什么是GCD
  • 队列和任务
    • 队列
    • 任务
  • 队列
    • 创建队列
    • 主队列和全局队列
    • 如何判断当前代码运行在某个队列
  • 同步任务、异步任务
    • dispatch_sync和dispatch_async
    • 同步任务,异步任务线程创建机制
      • 同步任务+并发队列
      • 异步任务+并发队列
      • 同步任务+串行队列

什么是GCD

GCD(Grand Central Dispatch) 是 Apple 开发的一个多核编程的较新的解决方法。它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统。它是一个在线程池模式的基础上执行的并发任务。在 Mac OS X 10.6 雪豹中首次推出,也可在 iOS 4 及以上版本使用。

队列和任务

GCD中有两个核心概念,队列和任务。

队列

队列其实就是线程池,在OC中以dispatch_queue_t表示,队列分串行队列和并发队列。

任务

任务其实就是线程执行的代码,在OC中以Block表示。
在队列中执行任务有两种方式:同步执行和异步执行。两者的主要区别是:是否等待队列的任务执行结束,以及是否具备创建新线程的能力。

  • 同步执行(sync):
    1、同步添加任务到指定的队列中,在添加的任务执行结束之前,会一直等待,直到队列里面的任务完成之后再继续执行。
    2、只能在当前线程中执行任务,不会创建新线程。
  • 异步执行(async):
    1、异步添加任务到指定的队列中,添加完成可以继续执行后面的代码。
    2、可以在新的线程中执行任务,可能会创建新线程。

队列

创建队列

用dispatch_queue_create来创建队列,其中第一个参数label表示队列的名称,可以为NULL;第二个参数attr用来表示创建串行队列还是并发队列,DISPATCH_QUEUE_SERIAL 或者NULL表示串行队列,DISPATCH_QUEUE_CONCURRENT 表示并发队列

dispatch_queue_t dispatch_queue_create(const char *_Nullable label, dispatch_queue_attr_t _Nullable attr);

主队列和全局队列

主队列:主队列是串行队列,只有一个线程,那就是主线程,添加到主队列中的任务会在主线执行。通过dispatch_get_main_queue获取主队列。
全局队列:全局队列是并发队列。可以通过dispatch_get_global_queue获取不同级别的全局队列

如何判断当前代码运行在某个队列

通过队列的label来判断

self.opQueue = dispatch_queue_create(NSStringFromClass([self class]).UTF8String, DISPATCH_QUEUE_SERIAL); //创建一个opQueue,名字为类名。注意:通过类名来创建一个唯一的队列名,因为OC类名不能重复 //下面的方法用来判断当前是否在opQueue - (BOOL)_isInOpQueue{      NSString* currentQueueLabel = [NSString stringWithUTF8String:dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL)];     if ([currentQueueLabel isEqualToString:NSStringFromClass([self class])]) {         return YES;     }      return NO; }

同步任务、异步任务

dispatch_sync和dispatch_async

用dispatch_sync来创建同步任务
用dispatch_async来创建异步任务
『主线程』中,『不同队列』+『不同任务』简单组合的区别:
GCD面试要点
『不同队列』+『不同任务』 组合,以及 『队列中嵌套队列』 使用的区别:
GCD面试要点

同步任务,异步任务线程创建机制

同步任务+并发队列

在当前线程中执行任务,不会开启新线程,执行完一个任务,再执行下一个任务 。执行如下代码:

- (void)syncTaskInConcurrentQueue {     NSLog(@"currentThread---%@",[NSThread currentThread]);     NSLog(@"begin");      dispatch_queue_t queue = dispatch_queue_create(NSStringFromClass([self class]).UTF8String, DISPATCH_QUEUE_CONCURRENT);      dispatch_sync(queue, ^{         [NSThread sleepForTimeInterval:1];         NSLog(@"1---%@",[NSThread currentThread]);     });      dispatch_sync(queue, ^{         [NSThread sleepForTimeInterval:1];         NSLog(@"2---%@",[NSThread currentThread]);     });      NSLog(@"end"); }
运行结果如下: 2020-11-12 00:18:10.088131+0800 OCTestDemo[3337:38026] currentThread---<NSThread: 0x6000020ee880>{number = 1, name = main} 2020-11-12 00:18:10.088254+0800 OCTestDemo[3337:38026] begin 2020-11-12 00:18:11.089673+0800 OCTestDemo[3337:38026] 1---<NSThread: 0x6000020ee880>{number = 1, name = main} 2020-11-12 00:18:12.090277+0800 OCTestDemo[3337:38026] 2---<NSThread: 0x6000020ee880>{number = 1, name = main} 2020-11-12 00:18:12.090526+0800 OCTestDemo[3337:38026] end 可以看到,dispatch_sync调用前运行在主线程,dispatch_sync添加的两个同步任务依次执行并且都运行在主线程,end最后打印,因为要等两个同步任务执行完才能执行后面的代码。

异步任务+并发队列

特点:可以开启多个线程,任务并发执行

- (void)asyncTaskInConcurrentQueue {     NSLog(@"currentThread---%@",[NSThread currentThread]);       NSLog(@"begin");      dispatch_queue_t queue = dispatch_queue_create(NSStringFromClass([self class]).UTF8String, DISPATCH_QUEUE_CONCURRENT);      dispatch_async(queue, ^{         [NSThread sleepForTimeInterval:2];         NSLog(@"1---%@",[NSThread currentThread]);     });      dispatch_async(queue, ^{         [NSThread sleepForTimeInterval:2];         NSLog(@"2---%@",[NSThread currentThread]);     });      NSLog(@"end"); }
运行结果如下: 2020-11-12 00:24:55.171031+0800 OCTestDemo[3458:40785] currentThread---<NSThread: 0x60000126d340>{number = 1, name = main} 2020-11-12 00:24:55.171137+0800 OCTestDemo[3458:40785] begin 2020-11-12 00:24:55.171260+0800 OCTestDemo[3458:40785] end 2020-11-12 00:24:57.176777+0800 OCTestDemo[3458:40829] 1---<NSThread: 0x6000012341c0>{number = 3, name = (null)} 2020-11-12 00:24:57.176782+0800 OCTestDemo[3458:40831] 2---<NSThread: 0x6000012495c0>{number = 4, name = (null)} 可以看到先打印了end,因为这两个任务是异步任务,调用dispatch_async不会阻塞主线程,可以继续执行后面的代码,所以先打印了end。然后再在两个不同的线程并发执行了这两个任务。注意:现执行任务1还是任务2是不确定的。

同步任务+串行队列

特点:不会开启新线程,在当前线程执行任务。任务是串行的,执行完一个任务,再执行下一个任务。
“`

  • (void)syncTaskInSerialQueue {
    NSLog(@”currentThread—%@”,[NSThread currentThread]);
    NSLog(@”begin”);

    dispatch_queue_t queue = dispatch_queue_create(NSStringFromClass([self class]).UTF8String, DISPATCH_QUEUE_SERIAL);

    dispatch_sync(queue, ^{
    [NSThread sleepForTimeInterval:2];
    NSLog(@”1—%@”,[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
    // 追加任务 2
    [NSThread sleepForTimeInterval:2];
    NSLog(@”2—%@”,[NSThread currentThread]);

GCD在iOS中应该是最常使用的并发编程技术了,GCD接口设计得很简洁,使用起来也很方便,由于苹果做了高度的封装,所以很多人对GCD的原理并不是很了解,本文来总结一下GCD常用面试要点。

  • 什么是GCD
  • 队列和任务
    • 队列
    • 任务
  • 队列
    • 创建队列
    • 主队列和全局队列
    • 如何判断当前代码运行在某个队列
  • 同步任务、异步任务
    • dispatch_sync和dispatch_async
    • 同步任务,异步任务线程创建机制
      • 同步任务+并发队列
      • 异步任务+并发队列
      • 同步任务+串行队列

什么是GCD

GCD(Grand Central Dispatch) 是 Apple 开发的一个多核编程的较新的解决方法。它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统。它是一个在线程池模式的基础上执行的并发任务。在 Mac OS X 10.6 雪豹中首次推出,也可在 iOS 4 及以上版本使用。

队列和任务

GCD中有两个核心概念,队列和任务。

队列

队列其实就是线程池,在OC中以dispatch_queue_t表示,队列分串行队列和并发队列。

任务

任务其实就是线程执行的代码,在OC中以Block表示。
在队列中执行任务有两种方式:同步执行和异步执行。两者的主要区别是:是否等待队列的任务执行结束,以及是否具备创建新线程的能力。

  • 同步执行(sync):
    1、同步添加任务到指定的队列中,在添加的任务执行结束之前,会一直等待,直到队列里面的任务完成之后再继续执行。
    2、只能在当前线程中执行任务,不会创建新线程。
  • 异步执行(async):
    1、异步添加任务到指定的队列中,添加完成可以继续执行后面的代码。
    2、可以在新的线程中执行任务,可能会创建新线程。

队列

创建队列

用dispatch_queue_create来创建队列,其中第一个参数label表示队列的名称,可以为NULL;第二个参数attr用来表示创建串行队列还是并发队列,DISPATCH_QUEUE_SERIAL 或者NULL表示串行队列,DISPATCH_QUEUE_CONCURRENT 表示并发队列

dispatch_queue_t dispatch_queue_create(const char *_Nullable label, dispatch_queue_attr_t _Nullable attr);

主队列和全局队列

主队列:主队列是串行队列,只有一个线程,那就是主线程,添加到主队列中的任务会在主线执行。通过dispatch_get_main_queue获取主队列。
全局队列:全局队列是并发队列。可以通过dispatch_get_global_queue获取不同级别的全局队列

如何判断当前代码运行在某个队列

通过队列的label来判断

self.opQueue = dispatch_queue_create(NSStringFromClass([self class]).UTF8String, DISPATCH_QUEUE_SERIAL); //创建一个opQueue,名字为类名。注意:通过类名来创建一个唯一的队列名,因为OC类名不能重复 //下面的方法用来判断当前是否在opQueue - (BOOL)_isInOpQueue{      NSString* currentQueueLabel = [NSString stringWithUTF8String:dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL)];     if ([currentQueueLabel isEqualToString:NSStringFromClass([self class])]) {         return YES;     }      return NO; }

同步任务、异步任务

dispatch_sync和dispatch_async

用dispatch_sync来创建同步任务
用dispatch_async来创建异步任务
『主线程』中,『不同队列』+『不同任务』简单组合的区别:
GCD面试要点
『不同队列』+『不同任务』 组合,以及 『队列中嵌套队列』 使用的区别:
GCD面试要点

同步任务,异步任务线程创建机制

同步任务+并发队列

在当前线程中执行任务,不会开启新线程,执行完一个任务,再执行下一个任务 。执行如下代码:

- (void)syncTaskInConcurrentQueue {     NSLog(@"currentThread---%@",[NSThread currentThread]);     NSLog(@"begin");      dispatch_queue_t queue = dispatch_queue_create(NSStringFromClass([self class]).UTF8String, DISPATCH_QUEUE_CONCURRENT);      dispatch_sync(queue, ^{         [NSThread sleepForTimeInterval:1];         NSLog(@"1---%@",[NSThread currentThread]);     });      dispatch_sync(queue, ^{         [NSThread sleepForTimeInterval:1];         NSLog(@"2---%@",[NSThread currentThread]);     });      NSLog(@"end"); }
运行结果如下: 2020-11-12 00:18:10.088131+0800 OCTestDemo[3337:38026] currentThread---<NSThread: 0x6000020ee880>{number = 1, name = main} 2020-11-12 00:18:10.088254+0800 OCTestDemo[3337:38026] begin 2020-11-12 00:18:11.089673+0800 OCTestDemo[3337:38026] 1---<NSThread: 0x6000020ee880>{number = 1, name = main} 2020-11-12 00:18:12.090277+0800 OCTestDemo[3337:38026] 2---<NSThread: 0x6000020ee880>{number = 1, name = main} 2020-11-12 00:18:12.090526+0800 OCTestDemo[3337:38026] end 可以看到,dispatch_sync调用前运行在主线程,dispatch_sync添加的两个同步任务依次执行并且都运行在主线程,end最后打印,因为要等两个同步任务执行完才能执行后面的代码。

异步任务+并发队列

特点:可以开启多个线程,任务并发执行

- (void)asyncTaskInConcurrentQueue {     NSLog(@"currentThread---%@",[NSThread currentThread]);       NSLog(@"begin");      dispatch_queue_t queue = dispatch_queue_create(NSStringFromClass([self class]).UTF8String, DISPATCH_QUEUE_CONCURRENT);      dispatch_async(queue, ^{         [NSThread sleepForTimeInterval:2];         NSLog(@"1---%@",[NSThread currentThread]);     });      dispatch_async(queue, ^{         [NSThread sleepForTimeInterval:2];         NSLog(@"2---%@",[NSThread currentThread]);     });      NSLog(@"end"); }
运行结果如下: 2020-11-12 00:24:55.171031+0800 OCTestDemo[3458:40785] currentThread---<NSThread: 0x60000126d340>{number = 1, name = main} 2020-11-12 00:24:55.171137+0800 OCTestDemo[3458:40785] begin 2020-11-12 00:24:55.171260+0800 OCTestDemo[3458:40785] end 2020-11-12 00:24:57.176777+0800 OCTestDemo[3458:40829] 1---<NSThread: 0x6000012341c0>{number = 3, name = (null)} 2020-11-12 00:24:57.176782+0800 OCTestDemo[3458:40831] 2---<NSThread: 0x6000012495c0>{number = 4, name = (null)} 可以看到先打印了end,因为这两个任务是异步任务,调用dispatch_async不会阻塞主线程,可以继续执行后面的代码,所以先打印了end。然后再在两个不同的线程并发执行了这两个任务。注意:现执行任务1还是任务2是不确定的。

同步任务+串行队列

特点:不会开启新线程,在当前线程执行任务。任务是串行的,执行完一个任务,再执行下一个任务。
“`

  • (void)syncTaskInSerialQueue {
    NSLog(@”currentThread—%@”,[NSThread currentThread]);
    NSLog(@”begin”);

    dispatch_queue_t queue = dispatch_queue_create(NSStringFromClass([self class]).UTF8String, DISPATCH_QUEUE_SERIAL);

    dispatch_sync(queue, ^{
    [NSThread sleepForTimeInterval:2];
    NSLog(@”1—%@”,[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
    // 追加任务 2
    [NSThread sleepForTimeInterval:2];
    NSLog(@”2—%@”,[NSThread currentThread]);

GCD在iOS中应该是最常使用的并发编程技术了,GCD接口设计得很简洁,使用起来也很方便,由于苹果做了高度的封装,所以很多人对GCD的原理并不是很了解,本文来总结一下GCD常用面试要点。

  • 什么是GCD
  • 队列和任务
    • 队列
    • 任务
  • 队列
    • 创建队列
    • 主队列和全局队列
    • 如何判断当前代码运行在某个队列
  • 同步任务、异步任务
    • dispatch_sync和dispatch_async
    • 同步任务,异步任务线程创建机制
      • 同步任务+并发队列
      • 异步任务+并发队列
      • 同步任务+串行队列

什么是GCD

GCD(Grand Central Dispatch) 是 Apple 开发的一个多核编程的较新的解决方法。它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统。它是一个在线程池模式的基础上执行的并发任务。在 Mac OS X 10.6 雪豹中首次推出,也可在 iOS 4 及以上版本使用。

队列和任务

GCD中有两个核心概念,队列和任务。

队列

队列其实就是线程池,在OC中以dispatch_queue_t表示,队列分串行队列和并发队列。

任务

任务其实就是线程执行的代码,在OC中以Block表示。
在队列中执行任务有两种方式:同步执行和异步执行。两者的主要区别是:是否等待队列的任务执行结束,以及是否具备创建新线程的能力。

  • 同步执行(sync):
    1、同步添加任务到指定的队列中,在添加的任务执行结束之前,会一直等待,直到队列里面的任务完成之后再继续执行。
    2、只能在当前线程中执行任务,不会创建新线程。
  • 异步执行(async):
    1、异步添加任务到指定的队列中,添加完成可以继续执行后面的代码。
    2、可以在新的线程中执行任务,可能会创建新线程。

队列

创建队列

用dispatch_queue_create来创建队列,其中第一个参数label表示队列的名称,可以为NULL;第二个参数attr用来表示创建串行队列还是并发队列,DISPATCH_QUEUE_SERIAL 或者NULL表示串行队列,DISPATCH_QUEUE_CONCURRENT 表示并发队列

dispatch_queue_t dispatch_queue_create(const char *_Nullable label, dispatch_queue_attr_t _Nullable attr);

主队列和全局队列

主队列:主队列是串行队列,只有一个线程,那就是主线程,添加到主队列中的任务会在主线执行。通过dispatch_get_main_queue获取主队列。
全局队列:全局队列是并发队列。可以通过dispatch_get_global_queue获取不同级别的全局队列

如何判断当前代码运行在某个队列

通过队列的label来判断

self.opQueue = dispatch_queue_create(NSStringFromClass([self class]).UTF8String, DISPATCH_QUEUE_SERIAL); //创建一个opQueue,名字为类名。注意:通过类名来创建一个唯一的队列名,因为OC类名不能重复 //下面的方法用来判断当前是否在opQueue - (BOOL)_isInOpQueue{      NSString* currentQueueLabel = [NSString stringWithUTF8String:dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL)];     if ([currentQueueLabel isEqualToString:NSStringFromClass([self class])]) {         return YES;     }      return NO; }

同步任务、异步任务

dispatch_sync和dispatch_async

用dispatch_sync来创建同步任务
用dispatch_async来创建异步任务
『主线程』中,『不同队列』+『不同任务』简单组合的区别:
GCD面试要点
『不同队列』+『不同任务』 组合,以及 『队列中嵌套队列』 使用的区别:
GCD面试要点

同步任务,异步任务线程创建机制

同步任务+并发队列

在当前线程中执行任务,不会开启新线程,执行完一个任务,再执行下一个任务 。执行如下代码:

- (void)syncTaskInConcurrentQueue {     NSLog(@"currentThread---%@",[NSThread currentThread]);     NSLog(@"begin");      dispatch_queue_t queue = dispatch_queue_create(NSStringFromClass([self class]).UTF8String, DISPATCH_QUEUE_CONCURRENT);      dispatch_sync(queue, ^{         [NSThread sleepForTimeInterval:1];         NSLog(@"1---%@",[NSThread currentThread]);     });      dispatch_sync(queue, ^{         [NSThread sleepForTimeInterval:1];         NSLog(@"2---%@",[NSThread currentThread]);     });      NSLog(@"end"); }
运行结果如下: 2020-11-12 00:18:10.088131+0800 OCTestDemo[3337:38026] currentThread---<NSThread: 0x6000020ee880>{number = 1, name = main} 2020-11-12 00:18:10.088254+0800 OCTestDemo[3337:38026] begin 2020-11-12 00:18:11.089673+0800 OCTestDemo[3337:38026] 1---<NSThread: 0x6000020ee880>{number = 1, name = main} 2020-11-12 00:18:12.090277+0800 OCTestDemo[3337:38026] 2---<NSThread: 0x6000020ee880>{number = 1, name = main} 2020-11-12 00:18:12.090526+0800 OCTestDemo[3337:38026] end 可以看到,dispatch_sync调用前运行在主线程,dispatch_sync添加的两个同步任务依次执行并且都运行在主线程,end最后打印,因为要等两个同步任务执行完才能执行后面的代码。

异步任务+并发队列

特点:可以开启多个线程,任务并发执行

- (void)asyncTaskInConcurrentQueue {     NSLog(@"currentThread---%@",[NSThread currentThread]);       NSLog(@"begin");      dispatch_queue_t queue = dispatch_queue_create(NSStringFromClass([self class]).UTF8String, DISPATCH_QUEUE_CONCURRENT);      dispatch_async(queue, ^{         [NSThread sleepForTimeInterval:2];         NSLog(@"1---%@",[NSThread currentThread]);     });      dispatch_async(queue, ^{         [NSThread sleepForTimeInterval:2];         NSLog(@"2---%@",[NSThread currentThread]);     });      NSLog(@"end"); }
运行结果如下: 2020-11-12 00:24:55.171031+0800 OCTestDemo[3458:40785] currentThread---<NSThread: 0x60000126d340>{number = 1, name = main} 2020-11-12 00:24:55.171137+0800 OCTestDemo[3458:40785] begin 2020-11-12 00:24:55.171260+0800 OCTestDemo[3458:40785] end 2020-11-12 00:24:57.176777+0800 OCTestDemo[3458:40829] 1---<NSThread: 0x6000012341c0>{number = 3, name = (null)} 2020-11-12 00:24:57.176782+0800 OCTestDemo[3458:40831] 2---<NSThread: 0x6000012495c0>{number = 4, name = (null)} 可以看到先打印了end,因为这两个任务是异步任务,调用dispatch_async不会阻塞主线程,可以继续执行后面的代码,所以先打印了end。然后再在两个不同的线程并发执行了这两个任务。注意:现执行任务1还是任务2是不确定的。

同步任务+串行队列

特点:不会开启新线程,在当前线程执行任务。任务是串行的,执行完一个任务,再执行下一个任务。
“`

  • (void)syncTaskInSerialQueue {
    NSLog(@”currentThread—%@”,[NSThread currentThread]);
    NSLog(@”begin”);

    dispatch_queue_t queue = dispatch_queue_create(NSStringFromClass([self class]).UTF8String, DISPATCH_QUEUE_SERIAL);

    dispatch_sync(queue, ^{
    [NSThread sleepForTimeInterval:2];
    NSLog(@”1—%@”,[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
    // 追加任务 2
    [NSThread sleepForTimeInterval:2];
    NSLog(@”2—%@”,[NSThread currentThread]);

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » GCD面试要点求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们