如何停止无限循环并允许在此循环期间接受触摸

时间:2014-01-28 09:09:23

标签: objective-c

 while (true)
 {
    endtime = CFAbsoluteTimeGetCurrent();
    double difftime = endtime - starttime;
    NSLog(@"The tine difference = %f",difftime);
    if (difftime >= 10)
    {
        NSURL *url= [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/a0.wav" , [[NSBundle mainBundle] resourcePath]]];
        NSError *error;
        audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
        audioPlayer.numberOfLoops=0;
        [audioPlayer play];
        starttime = endtime;
    }

}

当我调用此方法时,我的应用程序进入无限循环并且不再接受任何触摸,如何解决这个问题呢?

2 个答案:

答案 0 :(得分:0)

看起来你希望它每10秒播放一次声音。你最好使用像这样的计时器......

NSTimer *yourTimer = [NSTimer scheduledTimerWithTimeInterval:10.0
    target:self
    selector:@selector(repeatedAction)
    userInfo:nil
    repeats:YES];

然后有你的重复功能......

- (void)repeatedAction
{
    // do your stuff in here
}

用户界面会一直响应,您可以使用这样的操作取消按钮...

- (void)cancelRepeatedAction
{
    [self.yourTimer invalidateTimer];
}

这将停止重复动作的时间。

<强>无论其

您还尝试在每次运行操作时下载文件。

更好的方法是下载文件一次并存储。

更好的方法是异步下载文件。

答案 1 :(得分:0)

这不是您构建事件驱动的应用程序的方式。您通过不返回此函数来阻止事件处理队列(NSRunLoop)。因此,在您从此循环返回之前,没有触摸事件会有机会被处理。

你需要异步播放声音 - AVAudioPlayer可以为你做。阅读有关在AVFoundation中排队和播放音乐的ADC文档。

首先,您根本不需要while循环。只需开始播放,即可注册播放进度通知。使_audioPlayer成为控制器类的ivar,因为它的生命周期将持续超出用于加载文件和启动播放的方法:

NSURL *url= [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/a0.wav" , [[NSBundle mainBundle] resourcePath]]];
NSError *error;
_audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
_audioPlayer.numberOfLoops=0;
[_audioPlayer play];

然后定义一个实现AVAudioPlayerDelegate协议的委托方法,并提供至少这个方法:

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
}

您还可以在视图中提供触摸事件处理程序,该处理程序在控制器类中调用pauseAudio:方法,然后调用该方法:

[audioPlayer pause];

仔细阅读文档,并研究示例代码:

了解这个应用程序的结构,控制器注册通知并使用委托进行回调。它还使用计时器并具有GUI更新。