0

我正在做一个项目,我必须定期更新 UILabel 的文本(0.085f)。所以,我在这样的循环中插入标签的更新:

MetresNumber = MetresNumber + 0.25;
DisplayMetres.text = [NSString stringWithFormat:@"%07.0f", MetresNumber];

我确切地说“MetresNumber”是一个浮点数,而“DisplayMetres”是 UILabel。

而且这种代码真的很糟糕!自从我添加了这些行以来,它的速度真是令人难以置信。

我进行了一些搜索,发现了以下元素:

[DisplayMetres setNeedsDisplay];

但它并没有改变和更新标签上的文字。

它在一个用 调用的循环中:

timer = [NSTimer scheduledTimerWithTimeInterval:0.085 target:self selector:@selector(myLoop) userInfo:nil repeats:YES];

所以我的问题是,我的代码可以改进,以获得更好的性能,还是我应该忘记我的 UILabel 因为它太慢了?

谢谢 !

4

2 回答 2

1
  • (void)setNeedsLayout

当您想要调整视图的子视图的布局时,请在应用程序的主线程上调用此方法。此方法记录请求并立即返回。由于此方法不会强制立即更新,而是等待下一个更新周期,因此您可以使用它在更新这些视图中的任何一个之前使多个视图的布局无效。此行为允许您将所有布局更新合并到一个更新周期,这通常对性能更好。

另一个问题是在主线程跟踪触摸时不会调用 scheduleTimer。您需要在主运行循环中安排计时器。

所以而不是做

[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateLabel:) userInfo:nil repeats:YES];

采用

NSTimer* timer = [NSTimer timerWithTimeInterval:1.0f target:self selector:@selector(updateLabel:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

也使用 Timer 选择器方法,如下所示:

- (void) updateLabel:(id) sender {
    MetresNumber = MetresNumber + 0.25;
    NSString *text = [NSString stringWithFormat:@"%07.0f", MetresNumber];
    dispatch_sync(dispatch_get_main_queue(), ^{
        DisplayMetres.text = text;
    });

}

于 2013-06-15T01:06:19.397 回答
0

当您每 85 毫秒更新一个标签时,不应该有任何性能问题。首先找出真正导致滞后的原因。使用Time Profiler仪器。我想大部分时间都会花在画弦上。

以下是一些如何优化代码的提示:

  • 您无需在标签上调用setNeedsLayout或显式调用。setNeedsDisplay只需设置 text 属性(当然在主线程上)。

  • 代码中的结果字符串将始终是 7 位整数。考虑使用整数而不是浮点数。格式化整数会更快。

  • stringWithFormat有时可能很慢。您可以尝试使用 aNSNumberFormatter或简单地生成字符串:[@(MetresNumber) stringValue]

  • 在您的代码中,字符串实际上不会在每次计时器触发时发生变化。仅每 4 次。您可以将时间间隔设置为 4*0.085 并替换MetresNumber = MetresNumber + 0.25MetresNumber = MetresNumber + 1.

  • 尝试使用这个自定义 UILabel 类

  • 根本不要使用 UILabel。为每个数字使用预先绘制的图像。

  • 安排计时器NSRunLoopCommonModes(请参阅 Lightygalaxy 的答案)

于 2013-06-16T19:04:57.480 回答