在Objective C中,具有相同间隔的多个定时器是否相互干扰?

时间:2012-12-26 17:55:55

标签: objective-c nstimer

我在Objective-C中有两个NSTimers。其中一个导致对象慢慢向上移动iPhone屏幕,而另一个是分数计时器,每0.5秒为分数增加一个点。将对象向上移动到屏幕的计时器也具有0.5秒的间隔。按下按钮时会调用/激活这些计时器。按下按钮时,对象会在屏幕上慢慢向上移动0.5秒。在0.5秒之后,将一个点添加到乐谱中,这将正常工作。

然而,问题是在0.5秒之后,物体移回到屏幕底部的原始位置。然后它再次开始向上移动0.5秒,并立即向右移动回到屏幕底部。得分计时器工作正常,每0.5秒增加1点。

代码

-(IBAction)play:(id)sender{

    gametimer1 = [NSTimer scheduledTimerWithTimeInterval:0.05f target:self selector:@selector(gameLoop) userInfo:nil repeats:YES];

    scoretimer = [NSTimer scheduledTimerWithTimeInterval:0.05f target:self selector:@selector(scorechange) userInfo:nil repeats:YES];
}

-(void)scorechange{

    score = score + 1;
    scorelab.text = [NSString stringWithFormat:@"%i", score];

}

-(void)gameLoop{

    balstarted = YES;
    bal.center = CGPointMake(bal.center.x, bal.center.y - balspeed);

}

再一次,我的对象bal不再向上移动屏幕,而是向上移动几个像素(0.5秒),然后将自身重置为之前的位置。

2 个答案:

答案 0 :(得分:2)

REVISED

您已启用自动布局。当您更改scorelab.text时,UILabel会通知自动布局系统其内在内容大小已更改,这会导致自动布局重置每个视图的位置和大小。由于您尚未更改bal上的约束,因此autolayout会重置其位置。

您可以turn off autolayout,也可以修改bal的约束,而不是直接设置center

答案 1 :(得分:1)

选择器都在您安排计时器的同一个线程中执行。 只要你从同一个线程安排两个定时器,就没有任何干扰。如果在预定的方法中使用共享对象,则没有竞争条件。
只有从不同的线程安排定时器并且它们使用共享对象时才存在竞争条件。