23

我正在使用 Objective-C、Xcode 4.5.1 并为 iPhone 开发一个应用程序。

我有一个方法 A,我想在其中调用另一个方法 B 以每 x 秒进行一系列计算。在方法 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

Target 是 select 中指定的消息的接收者。在 Objective-C 中不调用函数。有相当多的消息发送到对象。Object 在内部引用它的符号表并确定它的哪个方法被调用。那是一个选择器。您的选择器是@selector(MethodB). (顺便说一句:您应该以小写开头的方法名称。“methodB”在这里更合适。)这导致了一个问题:如何确定消息发送到的对象?那就是目标。在你的情况下,它只是self.

顺便说一句:在这种情况下,选择器应该返回 void 并接受一个 id,它是 NSTimer 对象本身的 id。如果您希望计时器根据您的程序逻辑根据某些条件停止触发,这将派上用场。最重要的是:您的选择器 thenmethodB:而不是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 回答