【翻訳】《Swift and Cocoa Essentials》What Is Asynchronous Programming
非同期という言葉に出くわすと、多くの開発者はいまだに混乱します。非同期とはどういう意味なのか?非同期プログラミングとは何か?非同期プログラミングとは何かを理解するためには、まずその対極にある同期プログラミングを理解する必要があります。 playground を使ってその違いを説明しましょう。
同期プログラミング
Foundation フレームワークの import ステートメント を追加し、リモートリソースの URL を定義します。
URL を使用して Data オブジェクトを作成し、 Data オブジェクト のバイト数を表示します。 FINISHED という文字列が、 playground の最後にコンソールに出力されます。
import Foundation
let url = URL(string: "https://cdn.cocoacasts.com/7ba5c3e7df669703cd7f0f0d4cefa5e5947126a8/2.jpg")!
let data = try! Data(contentsOf: url)
print(data.count)
print("FINISHED")
playground の内容を実行し、コンソールの出力を検査します。文字列 FINISHED が出力される前に、 Data オブジェクト のバイト数が出力されています。 playground のステートメントは同期的に実行されるので、これは驚くべきことではありません。 playground は一度に1つのステートメントを実行します。前のステートメントの実行が終わると、次のステートメントが実行されます。これが同期プログラミングを理解しやすくしています。
597628
FINISHED
非同期プログラミング
非同期プログラミングを見てみましょう。もはや Data オブジェクト を同期的に生成することはありません。 Apple の並行処理ライブラリである Grand Central Dispatch を使って、 Data オブジェクト を非同期に生成します。
import Foundation
let url = URL(string: "https://cdn.cocoacasts.com/7ba5c3e7df669703cd7f0f0d4cefa5e5947126a8/2.jpg")!
DispatchQueue.global().async {
let data = try! Data(contentsOf: url)
print(data.count)
}
print("FINISHED")
playground の内容を実行します。コンソールの出力は、同期プログラミングと非同期プログラミングの違いを示しています。 文字列 FINISHED を表示する print 文 は、 Data オブジェクト のバイト数を表示するprint文に先行しています。
FINISHED
597628
playground のステートメントは、1つの例外を除いて、依然として同期的に実行されます。グローバルディスパッチキューの async(_:) メソッド に渡されたクロージャは非同期に実行されます。これは単に、クロージャがメインの playground のフローとは無関係に実行されることを意味します。
Grand Central Dispatch はクロージャをグローバルディスパッチキューに送信し、 playground の次のステートメントを続行します。クロージャ内のステートメントの実行が終了するのを待つことはありません。ある時点でクロージャが実行され、 Data オブジェクト のバイト数を表示する print 文 が実行されます。 文字列 FINISHED を表示する print 文 が最初に来るのはそのためです。
長所と短所
非同期プログラミングは複雑さをもたらしますが、ソフトウェア開発において一般的であるのにはそれなりの理由があります。例えを用いて、同期プログラミングと非同期プログラミングの長所と短所を探ってみましょう。
あなたは数人の友人に夕食を作る約束をしました。あなたはシンプルに、メインディッシュとデザートのケーキを用意します。ケーキの生地を作り、オーブンにセットします。ケーキを焼くのに約1時間かかります。選択肢は2つあります。1つ目は、ケーキが焼き上がるのを待つこと。待っている間、他にできることは何もありません。2つ目の選択肢は、ケーキをオーブンで焼いている間にメインディッシュの準備をすることです。
最初の選択肢は同期プログラミングに似ています。利点はシンプルであることです。一度に一つの作業に集中できるので、夕食の計画が立てやすくなります。2つ目の選択肢は、非同期プログラミングに似ています。この選択肢は、同時に複数のことが起こるため、より複雑です。利点はスピードです。メインディッシュに集中し、同時にケーキを焼くことができます。
次は?
非同期プログラミングは、レスポンスとパフォーマンスに優れたアプリケーションを構築するためには不可欠です。しかし、先に述べたように、非同期プログラミングは複雑さをもたらします。注意しなければならないリスクもいくつかあります。これらについては、 Mastering Grand Central Dispatch (https://cocoacasts.com/series/mastering-grand-central-dispatch) で詳しく説明します。
【翻訳元の記事】
Swift and Cocoa Essentials
What Is Asynchronous Programming
Discussion