objective-c – 秒表的观察者模式

objective-c – 秒表的观察者模式,第1张

概述我正在尝试基于MVC模型实现秒表. 秒表使用带有选择器的NSTimer – 每次超时都会调用(void)tick. 我试图将秒表作为可重用性的模型,但是我遇到了一些关于如何为每个滴答更新视图控制器的设计问题. 首先,我使用tick方法创建了一个协议,并使视图控制器成为委托.然后,视图控制器根据每个刻度线上的计时器属性更新视图. elapsedTime是一个只读的NSTimeInterval. 它有 我正在尝试基于MVC模型实现秒表.

秒表使用带有选择器的NSTimer – 每次超时都会调用(voID)tick.

我试图将秒表作为可重用性的模型,但是我遇到了一些关于如何为每个滴答更新视图控制器的设计问题.

首先,我使用tick方法创建了一个协议,并使视图控制器成为委托.然后,视图控制器根据每个刻度线上的计时器属性更新视图. elapsedtime是一个只读的NSTimeInterval.

它有效,但我认为这可能是糟糕的设计.我是Objective-C / @L_301_0@ touch初学者.我应该使用像KVO这样的东西吗?或者是否有更优雅的解决方案让模型通知视图控制器elapsedtime已更改?

解决方法 计时器是确保定期更新用户界面但不使用它来跟踪时间的好方法. NSTimer can drift,如果您使用计时器累积秒数,任何小错误都可能累积.

相反,使用NSTimer来触发更新UI的方法,但使用NSDate获取实时. NSDate将为您提供毫秒级的分辨率;如果你真的需要更好,请考虑this suggestion to use Mach’s timing functions.所以,使用NSDate,你的代码可能是这样的:

- (IBAction)startStopwatch:(ID)sender{    self.startTime = [NSDate date];    self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1                                                   target:self                                                selector:@selector(tick:)                                                userInfo:repeats:YES];}- (voID)tick:(NSTimer*)theTimer{    self.elapsedtime = [self.startTime timeIntervalSinceNow];    [self updatedisplay];}- (IBAction)stopStopwatch:(ID)sender{    [self.timer invalIDate];    self.timer = nil;    self.elapsedtime = [self.startTime timeIntervalSinceNow];    [self updatedisplay];}

如果允许重新启动等,您的代码可能会更复杂一些,但重要的是您没有使用NSTimer来测量总耗用时间.

您将在this SO thread中找到其他有用的信息.

总结

以上是内存溢出为你收集整理的objective-c – 秒表的观察者模式全部内容,希望文章能够帮你解决objective-c – 秒表的观察者模式所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1238940.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存