*

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

公開日: : 最終更新日:2014/11/15 Objective-C , , ,


スポンサードリンク



「iOS(Xcode6)におけるマルチスレッド処理の実装方法その1」に引き続きiOSに置けるマルチスレッド処理の第二回目のエントリーとなります。
本エントリーではObjective-CにおけるNSThreadクラスの簡単な実装サンプルとその説明を記載させていただきます。

利用しているXcodeは6.1です。

NSThreadクラスを利用したマルチスレッド処理

NSThreadクラスを利用したスレッド作成の説明をいただきます。
スレッド作成方法として2通りの方法が存在します。

  • NSThreadのdetachNewThreadSelectorメソッドを利用する方法
  • NSThreadのサブクラスを作成する方法

NSThreadのdetachNewThreadSelectorメソッドを利用する方法

detachNewThreadSelector呼び出し時にオブジェクトとスレッドで実行したいメソッド、及びそのメソッドの引数を指定します。

detachNewThreadSelectorの利用例1

XCTestCaseのテストメソッドからdetachNewThreadSelectorを利用したスレッド起動を行う例は以下の通りです。
とはいえXCTestCaseになった時点でメインスレッドでないスレッドで実行されてしまっているようですが・・・

testNSThread1メソッドにNSNumberのローカル変数roopNumを値10で宣言し、
detachNewThreadSelectorのtoTargetはself、メソッドはthreadFuncA、withObject(引数)はroopNumを指定して呼び出しています。よってThreadSampleObjective_CTestクラスのthreadFuncAメソッドにroopNumが引数として指定されスレッドが起動されます。

roopNumがNSNumberである理由はオブジェクト型でなければthreadFuncAの引数にできないからです。
あとスレッドを起動した後のfor文は起動したスレッドが終わる前にメインスレッドが終了するのを防ぐためです。
(メインスレッドが終了するとそれ以外のスレッドは強制的に停止させられます。)

実行した時のログ(NSLogのみ抜粋)は以下のようになります。
起動したスレッドのログ[8345:772076]の772076がスレッドのIDとなります。
メインスレッドのIDは772029となっています。
(本当はメインではないですが・・・)

detachNewThreadSelectorの利用例2

代わり映えしないですが、同じ処理を行うスレッドをもう1つ起動するようにしてみました。

ログは以下のようになりました。
メインスレッドのIDは775692、作成して2スレッドのIDは775735と775736となっていることが分かります。

NSThreadのサブクラスを使った方法

NSThreadクラスのサブクラスを作成し、mainメソッドをオーバーライドします。
別スレッドとして実行したい処理はmainメソッド内で実装します。

detachNewThreadSelectorメソッドを使ったスレッド起動とは異なり、NSThreadクラスのサブクラスをインスタンス化した後、そのインスタンスを使ってスレッドを起動するので、様々な状態をインスタンスにセットした後に実行できます。

detachNewThreadSelectorメソッドでも別スレッドとして実行されるメソッドの引数をNSDictionaryにすれば同じ様なことが実現可能ではありますが、スレッド実行中の状態を確認したい場合は、NSThreadのサブクラスを利用する必要があります。

処理自体はdetachNewThreadSelectorの利用例とほぼ同じですが、テストメソッドで出力するNSLogに起動したスレッドが動作しているかどうかの情報を追加しています。

NSThreadEx.hは以下の通りです。

NSThreadEx.mは以下の通りです。

スレッドを起動するテストメソッドは以下の通りです。

実行した時のログ(NSLogのみ抜粋)は以下のようになります。
起動したスレッドのIDが863290、テストメソッドのを実行しているスレッドのスレッドIDが863222となっています。

このログで注目すべきポイントはnSThreadEx.isFinishedが途中からYESに変わっていることです。
2014-11-03 21:31:04.449で起動したスレッドのNSLOGは終わっていますが、スレッドの終了が確認できるのは2014-11-03 21:31:07.448となっています。

今回の例ではNSThreadExクラスにプロパティは1つでしたが、もっとプロパティが増え場合にはNSThreadのサブクラスを利用したスレッドの作成の方が、そのプロパティを簡単に確認することができるため便利であると言えます。


スポンサードリンク

Googleアドセンス

Googleアドセンス




関連記事

Xcode5で画面にナビゲーションバーを配置して利用する。

今回は「ナビゲーションバー」をiPhoneアプリの画面に配置して利用する方法を記載させていただきます

記事を読む

Xcode6からはProjectName-Prefix.pchは自動的に生成されませんが、それでもpchファイルを利用したい時の利用方法

小ネタですが、Xcode6からはProjectName-Prefix.pchは自動的に生成されなくな

記事を読む

Xcodeの使い方[ツールバー]

Xcode5(iOS7対応バージョンの統合開発)の「ツールバー」の使い方のエントリーとなります。

記事を読む

Xcodeの使い方[エディタエリアの環境設定]

「Xcodeの使い方」に引き続き「Xcodeの使い方[エディタエリアの環境設定]」となります。

記事を読む

Xcode5のナビゲーションエリア[プロジェクト、シンボル、検索]の使い方

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

記事を読む

Xcodeのナビゲーションコントローラの使い方[「Single View Application」テンプレートからナビゲーションコントローラを利用する方法]

「Master-Detail Application」テンプレートを利用すれば、始めから「ナビゲーシ

記事を読む

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

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

記事を読む

Xcode5でイメージ(画像)を表示&操作する[後編]

Xcodeでアプリ開発を行う時に、イメージ(画像)の表示とイメージ操作時のイベント処理は必須とまでは

記事を読む

Xcode5のEmpty Application templateでStoryboardを利用する。

Xcode5のEmpty Application templateでStoryboardを利用する方

記事を読む

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

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

記事を読む

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 ↑