NSTimerとNSThread (2/6)
作成:2011-03-02 09:38
更新:2011-11-13 22:04
更新:2011-11-13 22:04
■NSTimerで利用するクラスを用意する
では、実際にNSTimerを使ってみることにしましょう。NSTimerでは、処理を実行させるクラスを設定して、そこにメッセージを送信して処理を行います。ですから、まずタイマー用のクラスを定義しておき、これをmainなどでNSTimerに設定して利用する、というのが一番わかりやすいでしょう。
下のリスト欄に、タイマー用クラスのソースコードを掲載しておきましょう。ここでは、MyTestClassというクラスを作成し、ここで必要な処理を用意することにしました。このクラスには、以下のようなインスタンス変数が用意されています。
count――現在の実行回数
endcount――終了する回数
タイマーで処理を実行するごとにcountの値を増やしていき、endcountになったらタイマーを終了させる、というようにするわけですね。コンビニエンスコンストラクタでは、endcountとなる値を引数で渡すようにしてあります。
タイマーで呼び出して利用するのは、printMessage:とcheckEnd:です(checkEnd:は、printMessage:の中から呼び出します)。タイマーで呼び出すメソッドは、引数にNSTimerを渡すようにしておきます。これはなくても呼び出すことは出来るんですが、「どのタイマーから呼び出されたか」をこれでチェックできるので用意しておいたほうがいいでしょう。
呼び出されるprintMessage:では、userInfoで受け渡されたNSDictionaryから必要な情報をとり出しています。これは、
printMessage:でメッセージを出力したら、checkEnd:で終了チェックをしています。countとendcountが同じになったら、引数で渡されたNSTimerのinvalidateを呼び出して終了しています。
――ざっと、こんな感じで、「タイマーで呼び出すクラス」はできあがりです。呼び出されるメソッドでNSTimerを受け取る以外は、さして難しいものはありませんね?
下のリスト欄に、タイマー用クラスのソースコードを掲載しておきましょう。ここでは、MyTestClassというクラスを作成し、ここで必要な処理を用意することにしました。このクラスには、以下のようなインスタンス変数が用意されています。
count――現在の実行回数
endcount――終了する回数
タイマーで処理を実行するごとにcountの値を増やしていき、endcountになったらタイマーを終了させる、というようにするわけですね。コンビニエンスコンストラクタでは、endcountとなる値を引数で渡すようにしてあります。
タイマーで呼び出して利用するのは、printMessage:とcheckEnd:です(checkEnd:は、printMessage:の中から呼び出します)。タイマーで呼び出すメソッドは、引数にNSTimerを渡すようにしておきます。これはなくても呼び出すことは出来るんですが、「どのタイマーから呼び出されたか」をこれでチェックできるので用意しておいたほうがいいでしょう。
呼び出されるprintMessage:では、userInfoで受け渡されたNSDictionaryから必要な情報をとり出しています。これは、
NSDictionary* 変数 = [《NSTimer*》userInfo];このようにして取り出すことができます。今回は、@"msg"というキーの値を取り出して出力させています。ということは、NSTimer作成時に、NSDictionaryにこのキーの値を保管しておけばいい、ということになります。
printMessage:でメッセージを出力したら、checkEnd:で終了チェックをしています。countとendcountが同じになったら、引数で渡されたNSTimerのinvalidateを呼び出して終了しています。
――ざっと、こんな感じで、「タイマーで呼び出すクラス」はできあがりです。呼び出されるメソッドでNSTimerを受け取る以外は、さして難しいものはありませんね?
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
※MyTestClass.h #import <Foundation/Foundation.h> @interface MyTestClass : NSObject { int count; int endcount; } +(MyTestClass*)myTestClassToEndCount:(int)n; -(void)setEndCount:(int)n; -(BOOL)checkEnd:(NSTimer*)t; -(void)printMessage:(NSTimer*)t; @end ※MyTestClass.m #import "MyTestClass.h" @implementation MyTestClass +(MyTestClass*)myTestClassToEndCount:(int)n { MyTestClass* obj = [[MyTestClass alloc] init]; [obj setEndCount:n]; return obj; } -(void)setEndCount:(int)n { endcount = n; } -(void)printMessage:(NSTimer*)t { id s = [[t userInfo] objectForKey:@"msg"]; NSLog(@"%@:%i",s,++count); [self checkEnd:t]; } -(BOOL)checkEnd:(NSTimer*)t { BOOL flg = NO; if (endcount == count){ NSLog(@"end."); flg = YES; [t invalidate]; } return flg; } @end
※関連コンテンツ
「初心者のためのObjective-Cプログラミング入門」に戻る