今日は、これらの日の出会いをプログラミング--GCD少数のインタビューの質問を説明する。質問は、基本的な概念とGCDの使用について非常にエレガントな、非常に良好でした。
基本的な概念については、私のブログは、インタビューの質問に、この章のショーを説明するために、先に言われてきました。私たちは、GCDに関する私の基本的な説明を見ることができます https://www.cnblogs.com/guohai-stronger/p/9038567。 HTML
コアプログラムは、実行が最終的に説明するために、当社の直接タイトルを実行するためにキューに入れられますGCDキュー派遣、派遣ブロックです:
例1 [1] GCDフェイス質問
- (ボイド)のviewDidLoad { [スーパーのviewDidLoad]。 【自己testGCD]。 } - (ボイド)testGCD { // 并行队列 dispatch_queue_tキュー= dispatch_queue_create(" ZXY " 、DISPATCH_QUEUE_CONCURRENT)。 NSLog(@ " 1 " ); dispatch_async(キュー、 ^ { のNSLog(@ " 2 " ); dispatch_async(キュー、 ^ { のNSLog(@" 3 " )。 })。 NSLog(@ " 4 " ); }); NSLog(@ " 5 " ); }
説明:
- キューを初めて目が作成され、並列キュー、待ち時間なしに、
- まずプリント1 、その後、その後、全体のコードセグメントdispatch_asyncものと見られてdispatch_asyncを、見て、並列キュー、および待機しない、コンテンツを実行した後、再び次のことを実行まわりdispatch_asyncもの、以下の内容を、。
- プリントアウトに続いて5 、プリントが再びdispatch_async全体のコードセグメントを実行する実行、5印刷の内容内部参照2 、ある dispatch_async、及び4を印刷
NSLog(@ "2"); dispatch_async(キュー、^ { のNSLog( "3" @); }); NSLog(@ "4");
- また、dispatch_async、及び非同期で実行、バック4、並列キューを印刷するので、それは最初の印刷実行される4
- 4プリントアウトを行った後、実行される3
スクリーンショットの検証結果:
[実施例] 2つのGCD顔質問2
- (ボイド)のviewDidLoad { [スーパーのviewDidLoad]。 【自己testGCD]。 } - (ボイド)testGCD { //串行き队列 dispatch_queue_tキュー= dispatch_queue_create(" ZXY " 、DISPATCH_QUEUE_SERIAL)。 NSLog(@ " 1 " ); dispatch_async(キュー、 ^ { のNSLog(@ " 2 " ); dispatch_sync(キュー、 ^ { のNSLog(@" 3 " )。 }); NSLog(@ " 4 " ); }); NSLog(@ " 5 " ); }
説明:
- まず、シリアルキューは唯一の順序で実行されます
- まず、プリントアウト1を 、そして dispatch_async遅く実行をされるコンテンツのスレッドを開きます、次の印刷を実行5
- プリントアウト5 dispatch_async内部に戻り、次に、非同期実行スレッドがオープンになり、そして(「2」@)のNSLogを発見し、 dispatch_syncyは、(「4」@)のNSLog同期実行され 、 そしてその後、プリントアウト2
- 外dispatch_asyncので、2の後にプリントアウトしてのNSLog(@「4」)を歩き始め、再び同期のNSLogの内側(@「3」)、その後、我々はdispatch_syncyはのNSLogの内側に同期している同期実行は、完全な実行されませんですました(「3」@)、その双方が、その結果、互いを待っているように、(「4」@)のNSLogを移動することができないデッドロック。
- プログラムでは、クラッシュ
スクリーンショットの検証結果:
[例] 3つのGCD面質問3
キュー= dispatch_queue_create dispatch_queue_t(" ZXY " 、DISPATCH_QUEUE_CONCURRENT); dispatch_async(キュー、 ^ { のNSLog(@ " HA 1。" ); }); dispatch_async(キュー、 ^ { のNSLog(@ " HA 2 " ); }); dispatch_sync(キュー、 ^ { のNSLog(@ " HA 3。" ); });
//////////////////// のNSLog(@ " HA 0 " )。 dispatch_async(キュー、 ^ { のNSLog(@ " HA 7。" ); }); dispatch_async(キュー、 ^ { のNSLog(@ " HA 8。" ); }); dispatch_async(キュー、 ^ { のNSLog(@ " HA 9 " ); });
1230789 1237890 B C D 3120798 2137890 3012789 C
1が正しい答えの5種類、上記?
説明:
- 最初は、並列キューDISPATCH_QUEUE_CONCURRENT、タスクの並列実行であります
- 後者の3前に、このコードは、実行するために完全に不可能で実装されていないので、同期は、上記HA 1及び2は、非同期ヘクタールであるが、場合HA実行が終了しているが、3ヘクタールで行われます3 0ハッハッハ直ちに実行される実行は、7,8,9 0を実行する前に発生しにくいです
- A、C、Eが可能であるから判断することができます
以下のようにして得られたのXcodeを実行するために、上記のコードは次のとおりです。Eの答えを
[実施例] 4つの4 GCD顔質問
私たちは、DISPATCH_QUEUE_SERIALを変更DISPATCH_QUEUE_CONCURRENTます
因为将并行队列改为串行队列,所有任务按部就班执行,所以结果如下(不加以讲解)
【例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); }
讲解:
- 首先不可能打印出0,因为有while循环,while不走完,是不可能走后面的.a = 0, 然后进入while循环, 因为是异步,所以就会开启线程执行a ++ , 可能开出的线程状态不好,所以a可能继续为0, ……
- 但是在某个时刻,可能线程64状态返回,执行a++, 所以a = 1 ,……
- 所以a的最后值是大于等于100(>=100)
可能状态还不错,从上面看出结果为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的认识会更上一层,谢谢!!!