我有一个应用程序,我想以越来越快的速度更改背景颜色。基本上,我希望背景颜色在三秒延迟后改变,然后延迟2.9秒......等等。
所以,我认为我会制作一个随机整数,用于挑选随机颜色(即每个整数对应一种颜色)。这很好,这里肯定没有问题。问题在于延误。我试图做一些事情,但我无法绕过它的逻辑。
我为没有发布我的代码而道歉,但我的代码现在非常复杂,并且需要理解上下文页面(可能是问题的一部分)。我正在寻找一个简单的解决方案。
答案 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:
函数每次检查的类的实例变量或属性,这样就可以停止进程了用户退出视图等