iPhone-呼叫方法延迟越来越少

时间:2014-08-25 23:23:37

标签: ios objective-c

我有一个应用程序,我想以越来越快的速度更改背景颜色。基本上,我希望背景颜色在三秒延迟后改变,然后延迟2.9秒......等等。

所以,我认为我会制作一个随机整数,用于挑选随机颜色(即每个整数对应一种颜色)。这很好,这里肯定没有问题。问题在于延误。我试图做一些事情,但我无法绕过它的逻辑。

我为没有发布我的代码而道歉,但我的代码现在非常复杂,并且需要理解上下文页面(可能是问题的一部分)。我正在寻找一个简单的解决方案。

2 个答案:

答案 0 :(得分:0)

GCD有一种方法可以在延迟后调度一个块:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(<#delayInSeconds#> * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        <#code to be executed after a specified delay#>
    });

你可以将它包装成一个终止于0的递归函数:

#define SECONDS_DECREMENT .1f

- (void)changeColorAfter:(float)seconds
{
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(seconds * NSEC_PER_SEC)), dispatch_get_main_queue(), ^
    {
        [self changeBackgroundToRandomColor];

        if (seconds > SECONDS_DECREMENT)
        {
            [self changeColorAfter:seconds - SECONDS_DECREMENT];
        }
    });
}

答案 1 :(得分:0)

您可以创建一个递归函数,每隔x个时间调用一次。像这样:

-(void)updateBackgroundWithInterval:(NSNumber *)interval {

    //Get the interval float value
    float intervalFloat = [interval floatValue];

    //Update your background and do whatever else

    NSLog(@"Hit interval = %.2f", intervalFloat);

    //Make your interval smaller
    intervalFloat -= 0.1;

    //Continue if the interval will be >= your minimum value (we'll say 0)
    if (intervalFloat > 0) {
        [self performSelector:@selector(updateBackgroundWithInterval:) withObject:@(intervalFloat) afterDelay:intervalFloat];
    }
}

然后,您可以使用以下内容调用它:

[self updateBackgroundWithInterval:@2.0];

我还建议使用某种BOOL标志作为updateBackgroundWithInterval:函数每次检查的类的实例变量或属性,这样就可以停止进程了用户退出视图等