*

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アドセンス




関連記事

no image

Xcode5のナビゲーションエリア[問題ナビゲータ]の使い方

Xcode5のナビゲーションエリアの使い方では、アプリ開発に最も不可欠は、プロジェクトとシンボルナビ

記事を読む

Xcode6&Objective-Cにおけるブロック構文(Blocks記法)の利用方法

Xcode&Objective-CにおけるBlock構文の説明のエントリーとなります。 B

記事を読む

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

iOSにおけるマルチスレッド処理の実装方法を数回に分けて説明させていただきます。 開発環境のXco

記事を読む

iOS(Xcode6とObjective-C)におけるマルチスレッド(非同期)処理の実装方法その2[GCD(Grand Central Dispatch)の利用]

本エントリーではGCD(Grand Central Dispatch)を利用したiOSのマルチスレッ

記事を読む

Xcode5で画面にツールバーを配置して利用する。

「ナビゲーションバー」と同様に「ツールバー」もナビゲーションコントローラ(UINavigationC

記事を読む

Xcode(Objective-C)のデリゲートとプロトコルの使い方[後編]

ではXcodeが既に用意しているデリゲートを利用した実装例について説明させていただきました。

記事を読む

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

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

記事を読む

Xcode5の「Auto Layout」機能の使い方[Pin制約の設定方法]

「基礎知識と制約(Align:アライメント)の設定方法」に引き続き、「Auto Layout」に必要

記事を読む

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

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

記事を読む

Xcodeのユーティリティエリアの使い方[ストーリーボード表示時の「File」,「Quick Help」,「Identity」]

本エントリーでは、「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 ↑