23

私はObjective-C、Xcode 4.5.1を使用しており、iPhone用のアプリで作業しています。

別のメソッドBを呼び出して、x秒ごとに一連の計算を実行するメソッドAがあります。メソッドAIで、オーディオファイルの再生を開始します。方法Bは、オーディオファイルの期間中、x秒ごとにオーディオを監視します。

私はNSTimer潜在的な解決策として見つけましたが、それを機能させる/理解するのに苦労しています。

x秒ごとにメソッドBを呼び出して計算を実行したいのですが、NSTimer何を伝えるべきかわからないものをいくつか提供する必要があります。

[NSTimer scheduledTimerWithTimeInterval:(NSTimeInterval) 
target:(id) select:(SEL) userInfo:(id) repeats:(BOOL)];

NSTimeInterval私が操作したい間隔を提供することは私の理解ですNSTimer。しかし、方法Bを実行するように指示するにはどうすればよいですか?

サンプルコードを見てきましたが、現在、' select:'でメソッドを提供しているという印象を受けています。しかし、私は''で何を書きtarget:ますか?なぜターゲットが必要なのですか?''を入力しようとしselfましたが、Xcodeから次のように表示されます。

宣言されていない識別子「self」の使用

[NSTimer scheduledTimerWithTimeInterval:0.1 target:self 
select:@selector(targetMethod:myVolumeMonitor()) userInfo:nil repeats:YES];

だから、私は' self'がオブジェクトへのポインタであるはずだと思いますが、どこを指したいですか?

以下は私のコードの簡略化です:

MethodA()
{
//Start playing an audio file.

//NSTimer calling Method B, as long the audio file is playing, every x seconds.
}

MethodB()
{
//Do calculations.
}

誰かが私にいくつかの答えを提供してくれたり、正しい方向に私を向けてくれたらありがたいです!(:

4

4 に答える 4

43

ターゲットは、selectで指定されたメッセージの受信者です。Objective-Cでは関数は呼び出されません。むしろオブジェクトに送信されるメッセージがあります。オブジェクトは内部的にそのシンボルテーブルを参照し、どのメソッドが呼び出されているかを判別します。それがセレクターです。セレクターは@selector(MethodB)です。(ところで、メソッド名は小文字で始める必要があります。ここでは「methodB」の方が適切です。)これは、メッセージの送信先のオブジェクトをどのように判別するかという質問につながります。それが目標です。あなたの場合、それは単にselfです。

ところで:この場合、セレクターはvoidを返し、NSTimerオブジェクト自体のIDであるIDを受け入れることが期待されます。これは、プログラムロジックに応じて、いくつかの条件に基づいてタイマーの起動を停止する場合に便利です。最も重要なのは、セレクターがではmethodB:なくということmethodBです。

- (void) methodA
{
//Start playing an audio file.

//NSTimer calling Method B, as long the audio file is playing, every 5 seconds.
[NSTimer scheduledTimerWithTimeInterval:5.0f 
target:self selector:@selector(methodB:) userInfo:nil repeats:YES];
}

- (void) methodB:(NSTimer *)timer
{
//Do calculations.
}
于 2012-11-19T13:33:13.737 に答える
6

これを試して

 NSTimer *aTimer = [NSTimer timerWithTimeInterval:(x) target:self selector:@selector(timerFired:) userInfo:nil repeats:YES];

    NSRunLoop *runner = [NSRunLoop currentRunLoop];
    [runner addTimer:aTimer forMode: NSDefaultRunLoopMode];  
    [popUpImageView release];

- (void)timerFired:(NSTimer*)theTimer 
{
if(condition)
{
  [theTimer isValid]; //recall the NSTimer
   //implement your methods
}
else
{
  [theTimer invalidate]; //stop the NSTimer

}

}
于 2012-11-19T13:27:29.150 に答える
5

さて、あなたは通常のCメソッドを呼び出そうとしていますが、NSTimerそれはできません。

ターゲットは、セレクターを呼び出すクラスのインスタンスであり、このセレクターは選択されません。ここでのセレクターは、関数SELで作成できるタイプです 。@selector(METHOD_NAME)

たとえば、これはhandleTimer :常に0.1秒を呼び出します:(この例ではAppDelegateが使用されます):

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //SNIP, some code to setup the windos.   

    [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(handleTimer:) userInfo:nil repeats:YES];
    return YES;
}

- (void) handleTimer:(NSTimer *)timer {
    // Hanlde the timed event.
}
于 2012-11-19T13:22:21.963 に答える
5

あなたがあなたのコードを見て、以下のものと比較した場合

[NSTimer scheduledTimerWithTimeInterval:0.1 target:self
select:@selector(targetMethod:myVolumeMonitor()) userInfo:nil repeats:YES];

selfは、クラスの同じインスタンスでメソッドを呼び出していることを意味します。この例では、メソッドはmyVolumeMonitorです。

[NSTimer scheduledTimerWithTimeInterval:0.1 target:self
selector:@selector(MethodB) userInfo:nil repeats:YES];

そして、あなたは行ってもいいです

メソッドは次のようになります

- (void)MethodB:(NSTimer*)timer { 
// do something
}
于 2012-11-19T13:23:03.617 に答える