2014-01-28 59 views
0
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; 
    } 

} 

当我调用此方法时,我的应用程序进入无限循环并且不再接受任何接触,请问该如何解决?如何在此循环中停止无限循环并允许接受触摸

+1

“我的应用程序进入无限循环” - 因为你告诉它这样做(你怎么看',而(真)'呢?) – 2014-01-28 09:10:30

+0

另外'difftime'是标准C函数的名称。不要将其用作变量名称。此外,'+ [NSString stringWithFormat:]'不适合创建路径名称。 ' - [NSString stringByAppendingPathComponent:]'是,但在你的具体情况下,你应该只使用' - [NSBundle pathForResource:ofType:]'。 – 2014-01-28 09:10:46

+0

由于几个原因,这段代码没有意义。更糟糕的是,它耗尽了CPU(并耗尽了电池)。你想达到什么目的?也许,异步方法可以解决这个问题。 – CouchDeveloper

回答

0

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

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

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

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

的UI将响应所有的时间,你可以有一个取消按钮像这样的动作...

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

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

无论其

你也试图下载一个文件,你运行你的动作每次。

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

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

+0

我不想添加一个取消按钮取消按钮的工作我想完成它touchbegin –

+0

那么,运行'cancelRepeatedAction'方法从touchBegin开始。它不会更改方法或实现。无论它是一个按钮,一个触摸,一个手势等等,它都可以工作。但是,从答案中得到的东西是使用计时器而不是循环。 – Fogmeister

+0

无效定时器有错误 –

0

这不是你如何构造一个事件驱动的应用程序。您通过不返回此功能来阻止事件处理队列(NSRunLoop)。所以在你从这个循环返回之前,没有碰触事件会得到处理的机会。

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

首先,您根本不需要while循环。只需开始播放,并注册播放进度的通知。使_audioPlayer控制器类的一个实例变量,因为它的寿命持续超过用于加载该文件,并开始播放的方法:

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更新功能。