Swift5の同期処理・非同期処理・GCDの入れ子の方法まとめ【Swift/Objective-C】

2020年8月27日

プログラムではメインスレッドを使った同期処理と、GCD(Grand Central Dispatchの略)というメインスレッドとは別に動く非同期処理があります。

同期処理、非同期処理を気にせずプログラムすると、ほとんどが同期処理になっています。そのため、同期処理が多くなりメインスレッドが詰まってしまうと、画面描画や画面遷移が極端に遅くなったりします。

こういった詰まりを、非同期処理を使うことによって回避することができ、スムーズに処理を進めることができます。iOSプログラムにとってとても重要な知識なので絶対に覚えておきましょう!

同期処理(メインスレッド)

Swift5

// 同期処理
DispatchQueue.main.async {
    print("メインスレッドです")
}

Objective-C

// 同期処理
dispatch_async(dispatch_get_main_queue(), ^{
	NSLog(@"メインスレッドす");
});

非同期処理 GCD (サブスレッド)

Swift5

// 非同期処理
DispatchQueue.global(qos: .default).async {
    print("サブスレッドです")
}

Objective-C

// 非同期処理
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
	NSLog(@"サブスレッドです");
});

非同期処理と同期処理の入れ子

Swift5

// 非同期処理内の一部のみ同期処理にする
DispatchQueue.global(qos: .default).async {
 
    print("サブスレッドです")
    
    DispatchQueue.main.async {
        print("メインスレッドです")
    }
}

Objective-C

// 非同期処理内の一部のみ同期処理にする
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
 
	NSLog(@"サブスレッドです");
 
	dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"メインスレッドです");
    });
});