如何在每次迭代时创建一个检查新IBAction输入的循环?

时间:2011-12-20 23:17:19

标签: iphone objective-c ios delegates uiviewcontroller

我想制作一个播放声音文件的循环(非常短暂的哔哔声)并等待延迟时间然后重复,此循环一直运行直到我点击暂停按钮并且可以通过滑块按钮更改等待时间延迟循环正在运行。

- (void)playSound 
{

NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/Metronome-Sound.mp3", [[NSBundle mainBundle] resourcePath]]];
NSError *error;
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];

audioPlayer.numberOfLoops = 0;
[audioPlayer play];
}

- (IBAction)playSelected:(UIButton *)sender
{
if (stateOfMetronome == 0){
    stateOfMetronome = 1;
    while (stateOfMetronome == 1){   
        [self playSound];
        [NSThread sleepForTimeInterval:delay];
    }
} 
}


- (IBAction)pauseSeleted:(UIButton *)sender
{
if (stateOfMetronome == 1){
    stateOfMetronome = 0;
    [audioPlayer pause];
}
}

1 个答案:

答案 0 :(得分:2)

实现这一目标的最无痛的方法我认为是使用NSTimer集来重复。当您需要停止/暂停时,只需使计时器无效。如果要启动它,只需重新初始化即可。使用此方法,您可以无痛地控制何时延迟发射以及轻松自定义间隔。

另外,请记住,在睡眠线程时,您可能会阻止所有UI交互。这可能意味着您在线程处于睡眠状态时无法播放/暂停,因为睡眠时没有运行循环处理。详见NSThread