在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;
}
}
}
现在如何最好地处理再次调用该方法的情况?我需要某种多线程吗?我不需要同时进行两个进程,因此似乎必须有一些我找不到的更简单的解决方案(对这种语言不熟悉)。
任何帮助都非常感谢!
答案 0 :(得分:1)
你不能那样做。循环运行时,不会处理任何事件。因此,如果用户再次按下按钮,则在循环结束之前不会发生任何事情。同样如此,你无法控制坡道的速度。我建议使用NSTimer。在你的changePitchSample:
方法中,你将新音高存储在某个地方(不要覆盖旧音高)并启动一次触发的定时器。当计时器触发时,你增加你的音高,如果它小于新的音高你重新启动计时器。
答案 1 :(得分:1)
不要使用while循环;它阻止了其他一切。使用计时器和状态机。计时器可以以您希望更改的速率调用状态机。状态机可以查看最后一个斜坡值和最后一个按钮命中的时间(甚至是一系列UI事件时间),并决定在下一个时间步骤中是否以及在多大程度上提升音量(逻辑通常只是一堆if和select / case语句,如果控制算法不适合一个漂亮的表)。然后状态机可以调用处理实际声级的对象或例程。
答案 2 :(得分:1)
查看NSOperation
和Concurrency Programming Guide。您可以先开始操作增加音高并存储操作对象。在第二个呼叫中,您可以呼叫[operation cancel]
以停止上一次操作。开始第二次操作,即减小音高并存储新对象。