【问题标题】:Do multiple timers with same interval interfere with each other in Objective C?Objective C中具有相同间隔的多个计时器是否相互干扰?
【发布时间】:2012-12-12 05:27:07
【问题描述】:

我在 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 秒内),然后将自身重置到之前的位置。

【问题讨论】:

  • 您可以通过禁用增加分数的计时器来测试他们是否干扰。根据它如何重置到初始位置,它似乎与拥有第二个计时器无关(不过,在显示的代码中没有立即弹出)。
  • 这听起来像是动画的问题,而不是使用两个计时器的问题。如果您为视图的框架设置动画但未将新的框架值设置到视图中,则视图的框架将“重置”。
  • 感谢您的 cmets! Nate Chandler,我如何将新的帧值设置到视图中?
  • Kitsune,如果我停止计分计时器,那么 bal 对象会完美地在屏幕上移动,并且计时器可以正常工作。但是,当我添加计分计时器时,bal 对象无法正确向上移动屏幕。

标签: objective-c nstimer


【解决方案1】:

修订

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

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

【讨论】:

  • 感谢您的回答,但我认为我不一定要添加动画。我对 CABasicAnimation 或 CALayer 并不完全熟悉。相反,我通过添加一个 NSTimer 来移动对象,并且在计时器的选择器方法中,我将对象的中心更改了几个像素。计时器使该对象在屏幕上以小增量移动。
  • @robmayoff,废话!你打败了我——我正要发布同样的东西。如果您使用自动布局,并且您的对象对视图底部有一个约束,您可以为该约束创建一个 IBOutlet(在我的示例中为 con1)并使用:self.con1.constant += balSpeed;移动对象,而不是设置中心。
【解决方案2】:

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

【讨论】:

  • 非常感谢。这些计时器是否安排在不同的线程中?抱歉,我对线程不熟悉。
  • 不,它将在同一个线程中。如果你想在不同的线程中运行它,那么你需要生成一个线程。
猜你喜欢
  • 2021-04-08
  • 2013-05-09
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 2020-04-08
  • 1970-01-01
相关资源
最近更新 更多