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;
}
}
当我调用此方法时,我的应用程序进入无限循环并且不再接受任何触摸,如何解决这个问题呢?
答案 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更新。