今天咱们讲解几道这两天遇到的面试题--GCD编程的.题目很不错,很考究关于GCD的基本概念和使用.html
对于基本的概念,本人博客已在前面讲过,本篇主要以面试题来说解.你们可看一下本人关于GCD的基本讲解 http://www.javashuo.com/article/p-qldrphhv-gy.html面试
GCD编程的核心就是dispatch队列, dispatch block的执行都会最终放到某个队列中执行.咱们直接以题目来说解:编程
【例1】GCD面试题1xcode
- (void)viewDidLoad { [super viewDidLoad]; [self testGCD]; } - (void)testGCD { //并行队列 dispatch_queue_t queue = dispatch_queue_create("zxy", DISPATCH_QUEUE_CONCURRENT); NSLog(@"1"); dispatch_async(queue, ^{ NSLog(@"2"); dispatch_async(queue, ^{ NSLog(@"3"); }); NSLog(@"4"); }); NSLog(@"5"); }
讲解:异步
NSLog(@"2"); dispatch_async(queue, ^{ NSLog(@"3"); }); NSLog(@"4");
验证结果截图:async
【例2】GCD面试题2spa
- (void)viewDidLoad { [super viewDidLoad]; [self testGCD]; } - (void)testGCD { //串行队列 dispatch_queue_t queue = dispatch_queue_create("zxy", DISPATCH_QUEUE_SERIAL); NSLog(@"1"); dispatch_async(queue, ^{ NSLog(@"2"); dispatch_sync(queue, ^{ NSLog(@"3"); }); NSLog(@"4"); }); NSLog(@"5"); }
讲解:线程
验证结果截图:3d
【例3】GCD面试题3code
dispatch_queue_t queue = dispatch_queue_create("zxy", DISPATCH_QUEUE_CONCURRENT); dispatch_async(queue, ^{ NSLog(@"哈哈哈 1"); }); dispatch_async(queue, ^{ NSLog(@"哈哈哈 2"); }); dispatch_sync(queue, ^{ NSLog(@"哈哈哈 3"); });
//////////////////// NSLog(@"哈哈哈 0"); dispatch_async(queue, ^{ NSLog(@"哈哈哈 7"); }); dispatch_async(queue, ^{ NSLog(@"哈哈哈 8"); }); dispatch_async(queue, ^{ NSLog(@"哈哈哈 9"); });
A 1230789 B 1237890 C 3120798 D 2137890 C 3012789
上面五种答案,哪个是对的?
讲解:
将上面的代码运行到xcode获得以下:E答案
【例4】GCD面试题4
咱们将DISPATCH_QUEUE_CONCURRENT改成DISPATCH_QUEUE_SERIAL
由于将并行队列改成串行队列,全部任务循序渐进执行,因此结果以下(不加以讲解)
【例5】GCD面试题5
- (void) testGCD{ __block NSInteger a = 0; while (a < 100) { dispatch_async(dispatch_get_global_queue(0, 0), ^{ a++; NSLog(@"%ld======%@", a, [NSThread currentThread]); }); } NSLog(@"卧槽无情%ld", a); }
讲解:
可能状态还不错,从上面看出结果为100
拓展 下面有几道一样的相似GCD面试题目,结果给你们,你们本身体会
【例6】GCD面试题6
- (void) testGCD2 { dispatch_queue_t queue = dispatch_queue_create("zxy", DISPATCH_QUEUE_CONCURRENT); NSLog(@"1"); dispatch_async(queue, ^{ NSLog(@"2"); dispatch_sync(queue, ^{ NSLog(@"3"); }); NSLog(@"4"); }); NSLog(@"5"); }
结果以下:
【例7】GCD面试题7
- (void) testGCD2 { dispatch_queue_t queue = dispatch_queue_create("zxy", DISPATCH_QUEUE_CONCURRENT); NSLog(@"1"); dispatch_async(queue, ^{ NSLog(@"2"); dispatch_async(queue, ^{ NSLog(@"3"); }); NSLog(@"4"); }); NSLog(@"5"); }
结果以下:
【例8】GCD面试题8
- (void) testGCD2 { dispatch_queue_t queue = dispatch_queue_create("zxy", DISPATCH_QUEUE_SERIAL); NSLog(@"1"); dispatch_async(queue, ^{ NSLog(@"2"); dispatch_async(queue, ^{ NSLog(@"3"); }); NSLog(@"4"); }); NSLog(@"5"); }
结果以下:
以上就是GCD的经典面试题,其实看了这几道面试题,发现还都是GCD的基本内容,串行队列,并行队列,以及同步异步是否开启线程的基本概念,但愿经过本次讲解,你们对GCD的认识会更上一层,谢谢!!!