如何处理在完成之前再次调用的类方法?

时间:2010-09-03 06:04:26

标签: iphone objective-c xcode ios

在iPhone设备上处理这种情况的最佳方法是什么:我的程序会在两个值之间缓和声音的音高。按下的按钮调用具有while循环的方法,该循环以小增量进行渐变。完成需要一些时间。与此同时,用户按下另一个按钮调用相同的方法。现在我希望第一次调用中的循环停止,第二次调用从当前状态开始。这是类似方法的样子:

-(void)changePitchSample: (float) newPitch{
float oldPitch=channel.pitch;
if (oldPitch>newPitch) {
    while (channel.pitch>newPitch) {
        channel.pitch = channel.pitch-0.001;
    }
}
else if (oldPitch<newPitch) {
    while (channel.pitch<newPitch) {
        channel.pitch = channel.pitch+0.001;
    }
}

}

现在如何最好地处理再次调用该方法的情况?我需要某种多线程吗?我不需要同时进行两个进程,因此似乎必须有一些我找不到的更简单的解决方案(对这种语言不熟悉)。

任何帮助都非常感谢!

3 个答案:

答案 0 :(得分:1)

你不能那样做。循环运行时,不会处理任何事件。因此,如果用户再次按下按钮,则在循环结束之前不会发生任何事情。同样如此,你无法控制坡道的速度。我建议使用NSTimer。在你的changePitchSample:方法中,你将新音高存储在某个地方(不要覆盖旧音高)并启动一次触发的定时器。当计时器触发时,你增加你的音高,如果它小于新的音高你重新启动计时器。

答案 1 :(得分:1)

不要使用while循环;它阻止了其他一切。使用计时器和状态机。计时器可以以您希望更改的速率调用状态机。状态机可以查看最后一个斜坡值和最后一个按钮命中的时间(甚至是一系列UI事件时间),并决定在下一个时间步骤中是否以及在多大程度上提升音量(逻辑通常只是一堆if和select / case语句,如果控制算法不适合一个漂亮的表)。然后状态机可以调用处理实际声级的对象或例程。

答案 2 :(得分:1)

查看NSOperationConcurrency Programming Guide。您可以先开始操作增加音高并存储操作对象。在第二个呼叫中,您可以呼叫[operation cancel]以停止上一次操作。开始第二次操作,即减小音高并存储新对象。

顺便说一句:你现在正在做的事情非常糟糕,因为你“阻止主线程”。不需要直接执行需要一些时间的计算。您可能还应该查看NSTimer,以使您的代码独立于处理器速度。