スレッド移行の手法を使用できます
次に、GCDと呼ばれる興味深いタスクがあります-Grand Central Dispatch
Grand Central Dispatch(GCD)は、マルチコアプロセッサやその他の対称型マルチプロセッシングシステムを備えたシステムのアプリケーションサポートを最適化するためにApple Inc.によって開発されたテクノロジであり、スレッドプールパターンに基づくタスク並列処理の実装です。
GCDは、並行して実行できるプログラム内の特定のタスクを実行のためにキューに入れ、処理リソースの可用性に応じて、使用可能なプロセッサコアのいずれかで実行するようにスケジュールすることで機能します。
ディスパッチキューは、匿名コードブロックまたは関数のいずれかのタスクのキューを維持し、これらのタスクを順番に実行するオブジェクトです。ライブラリは、複数のタスクを同時に実行する異なる優先度レベルの複数のキューを自動的に作成し、オペレーティング環境に基づいて実行するタスクの最適な数を選択します。ライブラリのクライアントは、送信された順序でタスクを一度に1つずつ実行する、任意の数のシリアルキューを作成することもできます。シリアルキューは一度に1つのタスクしか実行できないため、キューに送信された各タスクは、キュー上の他のタスクに関して重要です。したがって、競合するリソースをロックする代わりに、シリアルキューを使用できます。
ディスパッチキューは、他のディスパッチキューに対して同時にタスクを実行します。タスクのシリアル化は、単一のディスパッチキュー内のタスクに制限されています。
あなたの場合、シリアルディスパッチキューを使用できます
シリアルキューは、タスクを特定の順序で実行する場合に役立ちます。シリアルキューは一度に1つのタスクのみを実行し、常にキューの先頭からタスクをプルします。共有リソースまたは可変データ構造を保護するために、ロックの代わりにシリアルキューを使用する場合があります。ロックとは異なり、シリアルキューは、タスクが予測可能な順序で実行されることを保証します。また、タスクを非同期でシリアルキューに送信する限り、キューがデッドロックすることはありません。
自動的に作成される並行キューとは異なり、使用するシリアルキューを明示的に作成および管理する必要があります。アプリケーションには任意の数のシリアルキューを作成できますが、できるだけ多くのタスクを同時に実行する手段としてのみ、多数のシリアルキューを作成することは避けてください。多数のタスクを同時に実行する場合は、それらをグローバル並行キューの1つに送信します。シリアルキューを作成するときは、リソースの保護やアプリケーションの主要な動作の同期など、各キューの目的を特定するようにしてください。
dispatch_queue_t queue;
queue = dispatch_queue_create("com.example.MyQueue", NULL);
このコードは、カスタムシリアルキューを作成するために必要な手順を示しています。dispatch_queue_create関数は、キュー名とキュー属性のセットの2つのパラメーターを取ります。デバッガーおよびパフォーマンスツールは、タスクがどのように実行されているかを追跡するのに役立つキュー名を表示します。キュー属性は将来の使用のために予約されており、NULLにする必要があります。
Grand Central Dispatchは、アプリケーションからいくつかの一般的なディスパッチキューにアクセスできるようにする機能を提供します。
デバッグ目的または現在のキューのIDをテストするために、 dispatch_get_current_queue関数を使用します。ブロックオブジェクト内からこの関数を呼び出すと、ブロックが送信された(そして現在実行されていると思われる)キューが返されます。ブロックの外側からこの関数を呼び出すと、アプリケーションのデフォルトの同時キューが返されます。
dispatch_get_main_queue関数を使用して、アプリケーションのメインスレッドに関連付けられたシリアルディスパッチキューを取得します。このキューは、Cocoaアプリケーション、およびメインスレッドでdispatch_main関数を呼び出すか、実行ループを構成するアプリケーション(CFRunLoopRefタイプまたはNSRunLoopオブジェクトのいずれかを使用)に対して自動的に作成されます。
dispatch_get_global_queue関数を使用して、共有同時キューのいずれかを取得します。
注:並行ディスパッチ・キューまたはメイン・ディスパッチ・キューを含む、グローバル・ディスパッチ・キューを保持または解放する必要はありません。キューを保持または解放しようとする試みはすべて無視されます。
出典:並行性プログラミングガイド