*

iOS(Xcode6)におけるマルチスレッド処理の実装方法[iOSのマルチスレッド処理の概要]

公開日: : 最終更新日:2016/12/05 Objective-C , , , , ,


スポンサードリンク



iOSにおけるマルチスレッド処理の実装方法を数回に分けて説明させていただきます。
開発環境のXcodeは6.1となります。
言語はObjective-CとSwiftの両方の例をできる限り記載させていただこうと考えております。

第一回は「iOSのマルチスレッド処理の概要」とさせていただきます。
第一回のエントリーの内容は以下の通りです。

  1. マルチスレッド処理が必要な理由
  2. iOSで実現可能なマルチスレッド処理
  3. マルチスレッド処理に不可欠な考え方


1 マルチスレッド処理が必要な理由

マルチスレッド処理とは

マルチスレッドとは、文字を見て感じるイメージのままですが、スレッドがマルチ(複数)存在する処理です。
なお、スレッドとは処理を行う時の最小の実行単位です。

一般的なアプリケーションを起動すると対応する単一のプロセスが起動します。単一のプロセスにはメインスレッドと呼ばれるスレッドが存在します。
アプリケーションの実装方法によっては、そのアプリケーションのプロセスにメインスレッド以外のスレッドが生成、実行されます。
スクリーンショット 2014-11-02 19.42.38

とはいえ、実行環境のマシンのCPUコアが単一の場合は、複数スレッドが実行されるような実装を行っても結局は任意のタイミングで動作するスレッドは単一となります。インテルのハイパースレッディングテクノロジーでは他のCPUとは異なるようです。まあiOSには関係ない話ですが・・・

同一プロセスの各スレッドはメモリー空間を共有しますので、処理がスレッドセーフになるよう排他制御を考慮する必要があります。

マルチスレッドを使わなくても正しく動作するアプリケーションを作成することは可能です。
しかし。マルチスレッド処理を使わないとアプリケーションの利用者にとって使い勝手が良い物とはならない可能性が発生します。

良くあげられる例としては、画面表示処理です。例えば表示したいデータの件数が1000件あるとします。データはWebサービスやデータベースから取得して、画面に表示できる形に整形する必要があります。1000件を一度の処理で表示しようとした場合、その間は画面が動作していないように見えます。俗に言う固まった状態です。
そうならないように別スレッドでデータを10件ずつ取得し、10件取得する毎にメインスレッドが画面に表示するようにすれば画面が固まったようには感じないし、何よりも利用者が「あ!、ちゃんとこのアプリ動いている」と思えますし、使い勝手もこちらの方が良いと言えます。

マルチスレッド処理の不利な点

マルチスレッド処理を行うことによってアプリケーションの動作が複雑になります。マルチスレッド処理でバグを作り込んでしまった場合のデバッグ作業は難しくなります。バグの再現性にも大きな影響を与えます。

単純なシングルスレッドのプログラムにおけるバグは再現手順さえ明確になれば、問題点の絞り込みを行うのも簡単ですので修正の難易度は低いと言えます。
マルチスレッド処理のプログラムは再現手順が分かったとしても、再現率が低いので問題点の絞り込みも困難です。修正作業も難易度は高いと言えます。
よって、できればマルチスレッド処理を明示的に行わない方が良いですが、利用者の利便性を考慮して利用の可否を判断する必要があります。

2 iOSで実現可能なマルチスレッド処理

iOS(Objective-C)で実装可能なマルチスレッド処理は大きく分けて3種類存在します。

  • NSThreadクラス
  • GCD(Grand Central Dispatch)
  • オペレーションオブジェクト

NSThreadクラス

NSThreadのスレッド起動用メソッドに、オブジェクトとメソッドを指定することで1つのスレッドを起動することが可能です。
この方法がもっとも単純なマルチスレッド処理の利用方法です。iOSの全てのバージョンで利用可能です。

NSThreadクラス関連のエントリー

NSThreadクラスの関連エントリーは以下のものがありますので、是非ごらんください。
「iOS(Xcode6とObjective-C)におけるマルチスレッド処理の実装方法その1[NSThreadクラスの簡単な利用例]」
「iOS(Xcode6とSwift)におけるマルチスレッド処理の実装方法その1[NSThreadクラスの簡単な利用例]」

GCD(Grand Central Dispatch)

GCDでは、Blocks(ブロック)記法を利用して、ブロックというコードのまとまりを作成し、このブロックをディスパッチキューと呼ばれるキューに追加することでマルチスレッド処理を実現します。

ディスパッチキューに追加されたブロックは適宜キューから取り出され、OSによって既に作成されているワーカースレッドによって実行されます。
個別にスレッドを作成しないので、この点ではNSThreadよりシステムにかかる負荷は小さいと言えます。
(スレッドを作成し動作させること自体結構な負荷となります。)

ワーカースレッドの数はコア数に応じて自動的に決定されます。
GCDはiOS4.0以降で利用可能です。

GCD関連のエントリー

GCDの関連エントリーは以下のものがありますので、是非ごらんください。
「iOS(Xcode6とObjective-C)におけるマルチスレッド(非同期)処理の実装方法その2[GCD(Grand Central Dispatch)の利用]」
「iOS(Xcode6とSwift)におけるマルチスレッド(非同期)処理の実装方法その2[GCD(Grand Central Dispatch)の利用]」

オペレーションオブジェクト

オペレーションと呼ばれるオブジェクトを作成し、そのオブジェクト中にスレッドで実行する処理を含めておきます。
オペレーションオブジェクトは、オペレーションキューというキューに追加に追加することでマルチスレッド処理を実現します。

あとはGCDと同じ考え方で、システムがオペレーションキューから適宜キューを取り出して、オペレーションオブジェクト用のワーカースレッドによって実行されます。

扱う対象がブロックかオペレーションオブジェクトか、がGCDとオペレーションオブジェクトの相違点です。
オペレーションオブジェクトよりブロックの方が小さい処理単位となります。

オペレーションオブジェクトはiOS2.0以降で利用可能です。

3 マルチスレッド処理に不可欠な考え方

先ほども記載いたしましたが、同一プロセスの各スレッドはメモリー空間を共有しますので、処理がスレッドセーフになるよう排他制御を考慮する必要があります。
具体的には

  • 画面(UI)コンポーネントの値の更新はメインスレッドからしか行えない。
  • スレッドセーフでない変数は@synchronized等を用いてスレッドセーフ化する。

等の対策が必要です。


スポンサードリンク

Googleアドセンス

Googleアドセンス




関連記事

Xcodeのユーティリティエリアの使い方[ストーリーボード表示時の「Attributes」,「Size」,「Connections」Inspector]

本エントリーでは、「Xcodeのユーティリティエリアの使い方」に引き続き、「ストーリーボード」表示時

記事を読む

Xcodeの使い方

Objective-Cでコーディングを行うための統合開発環境のXcodeの利用方法のエントリーです。

記事を読む

Objective-C(Xcode)でイメージのアニメーション表示を行う。

「Xcode5でイメージ(画像)を表示&操作する」では画面に表示されているイメージをタップし

記事を読む

Xcode&Objective-Cの文字列処理をユニットテスト(XCTestフレームワーク)で確認する。[NSStringを数値に変換する方法]

「Xcode&Objective-Cの文字列処理をユニットテスト(XCTestフレームワーク)で確認

記事を読む

Objective-Cでコールバック処理を@Selectorで実現する方法

最近はSwiftばっかり読み書きしていますが、既存のライブラリをカスタマイズして使うことも多いので

記事を読む

Xcode5でSchemeを利用する。[後編]

「Xcode5でSchemeを利用する。」の続きの「Xcode5でSchemeを利用する。[後編]」

記事を読む

Xcode5で画面コンポーネント(UIコンポーネント)配置して利用するための基本

iOSアプリケーションは当然ですが、画面がありますよね。 言わずもがなですが、iOS向けのアプ

記事を読む

Xcode5&Objective-CでUITableViewでUINibを使ったカスタムセル(UITableViewCell)を利用する方法

本エントリーでは、Xcode5のテーブルビューにUINibを使ったカスタムセル(UITableVie

記事を読む

iOS(Xcode6とObjective-C)におけるマルチスレッド処理の実装方法その1[NSThreadクラスの簡単な利用例]

「iOS(Xcode6)におけるマルチスレッド処理の実装方法その1」に引き続きiOSに置けるマルチス

記事を読む

Xcode5でSchemeを利用する。[前編]

Xcode5の「Scheme」の作成方法や使い方のエントリーとなります。 思った以上に内容が多くな

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

動画で英語を学習できるiOSの無料アプリCapTubeをリリースいたしました。

個人では初となるiOSアプリをリリースいたしました。 何度もリジ

no image
Ruby on rails4系でBootstrapを利用するためのtips

MacでRuby on rails4系のBootstrapを利用しよう

no image
Java、Eclipse、JUnit関連のエントリーの移行のお知らせ

Java、Eclipse、JUnit関連のエントリーは http:/

iOS8開発者向けお勧め本紹介[詳細! Swift iPhoneアプリ開発 入門ノート Swift 1.1+Xcode 6.1+iOS 8.1対応]

iOS7開発者向けお勧め本紹介を以前に紹介させていただきまいたが、今回

Swift入門(Xcode6のXCTestフレームワークで学ぶ) 第二回「関数(メソッド)とクロージャーの利用方法」

前回はSwiftの概要をザックリと説明させていただきました。 今

→もっと見る

Optimization WordPress Plugins & Solutions by W3 EDGE
PAGE TOP ↑