Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何处理类方法在完成之前再次被调用?_Iphone_Objective C_Xcode_Ios - Fatal编程技术网

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

Iphone 如何处理类方法在完成之前再次被调用?,iphone,objective-c,xcode,ios,Iphone,Objective C,Xcode,Ios,在iPhone设备上处理这种情况的最佳方法是什么:我的程序在两个值之间倾斜音高。按下按钮调用一个方法,该方法有一个while循环,该循环以小增量进行渐变。完成这项工作需要一些时间。同时,用户按下了另一个按钮调用相同的方法。现在我希望第一个调用中的循环停止,第二个调用从当前状态开始。下面是方法应该是什么样子的示例: -(void)changePitchSample: (float) newPitch{ float oldPitch=channel.pitch; if (oldPitch>ne

在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;
    }
}
-(void)changePitchSample:(float)newPitch{
float oldpoint=channel.pitch;
如果(旧音高>新音高){
while(频道音高>新音高){
channel.pitch=channel.pitch-0.001;
}
}

否则如果(oldPitch您不能这样做。当循环运行时,不会处理任何事件。因此,如果用户再次按下按钮,在循环完成之前不会发生任何事情。同样,您无法控制坡道的速度。我建议使用NSTimer。在
changePitchSample:
方法中,您存储新的节距omewhere(不要覆盖旧的)然后启动一个计时器,启动一次。当计时器启动时,你增加你的音调,如果它小于新的音调,你重新启动计时器。

不要使用while循环;它会阻塞其他所有内容。使用计时器和状态机。计时器可以按你希望的速率调用状态机。状态机可以查看最后一个渐变值和最后一次按钮点击的时间(甚至是一组UI事件时间),并决定是否以及在下一个时间步骤中渐变多少音量(如果控制算法不适合一个好的表,逻辑通常只是一堆if和select/case语句)。然后,状态机可以调用处理实际声级的对象或例程。

请查看
NSOperation
和。您可以首先开始操作,增加音调,还可以存储操作对象。在第二次调用时,您可以调用
[操作取消]
停止上一个操作。开始第二个操作,即减小俯仰,同时存储新对象


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

谢谢。我在某个地方读到,NSTimer的分辨率为100ms左右,但我自己还没有测试它(很可能是错误的)。这种分辨率当然不能产生平滑的渐变。没错,苹果公司的文档说大约50-100毫秒。确切的分辨率还取决于运行循环中发生的其他事情。我会尝试计时器,看看它是否足够好。否则,你可能必须使用另一个线程。是的,我会尝试这种计时Interval不适用于音高,因为它需要非常平滑。因此我还需要研究线程…谢谢,但正如您在上面关于NSTimer的另一个答案的讨论中所看到的,它没有足够大的分辨率来处理音高(这将导致非常清晰的步进)。我可能需要在一个单独的线程或类似的线程中运行状态机。谢谢,我将研究NSOperation,但我可能仍然需要某种多线程,正如您从其他关于NSTimer不够快的答案中看到的那样。@materialvision:如果需要线程,NSOperation是最简单的方法。@materialvision:NSOperation是执行多线程处理的一种方法。操作队列为其上的每个操作生成一个新线程。