【问题标题】:Building a realtime clock in iOS update with NSTimer or performSelector?使用 NSTimer 或 performSelector 在 iOS 更新中构建实时时钟?
【发布时间】:2013-06-24 13:21:55
【问题描述】:

我想在标签中显示实时,我找到了两种更新NSDate的方法:

performSelector 方法:

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self updateTime];
}

- (void)updateTime
{
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"hh:mm:ss"];
    label.text = [dateFormat stringFromDate:[NSDate date]];

    //call updateTime again after 1 second
    [self performSelector:@selector(updateTime) withObject:self afterDelay:1.0];
}

NSTimer 方法:

- (void)viewDidLoad
{
    [super viewDidLoad];

    Timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime) userInfo:nil repeats:YES];
}    

- (void)updateTime 
{
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"hh:mm:ss"];
    label.text = [dateFormat stringFromDate:[NSDate date]];
}

哪种方法更好、性能更高、更可靠?

【问题讨论】:

  • 创建NSDateFormatter 的成本很高。创建一次并重复使用。

标签: objective-c nsdate nstimer


【解决方案1】:

首先,这与 Xcode 不太相关。

其次:性能更高? 说真的?什么时候被称为每秒一次?别再担心效率了。

第三,它们是等价的,但我认为不需要对方法进行类似递归的自调用。只需使用NSTimer,这正是它被发明的原因。

【讨论】:

  • 在这两种情况下都没有递归。 performSelector:withObject:afterDelay: 只是安排自己的未来调用,由运行循环管理;没有炸毁堆栈的危险。
  • @ipmcc 我没有写它会炸毁堆栈,是吗。(但你是对的,从技术上讲没有递归。)我的主要问题是可读性和滥用工具。
  • 感谢您的快速解答 H2CO3 和 ipmcc。我会选择NSTimer
【解决方案2】:

计时器会尽力按照“固定”时间表执行,即每秒一次。

另一方面,在一个需要 500 毫秒执行时间的函数结束时调用 performSelector:afterDelay 将导致您的函数每 1500 毫秒调用一次(执行时间为 500 毫秒 + 1 秒延迟)。

因此计时器更可靠。正如 H2CO3 所说,忘掉性能吧,这样简单的任务是没有问题的。

【讨论】:

  • 感谢您的解释。我注意到如果我使用scheduledTimerWithTimeInterval:0.5,秒数仍然正确运行(每秒)。这是为什么呢?
  • 你在一秒钟内更新了两次。只是你看不到它,因为在连续两次运行期间文本保持不变。
猜你喜欢
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
相关资源
最近更新 更多