我的MotorViewController
中有5个按钮,用作5个电机的开/关开关。按下按钮A,电动机A将无限期运行,直到您再次按下按钮将其停止。
我刚刚添加了第6个按钮,它将告诉电动机A运行2分钟。我在NSTimer
中添加了ViewController
代码,一切正常。 2分钟后,我调用方法runPump
,然后电动机自动关闭。
我一直在非常优化我的MotorViewController
,这将是第一次为NSTimer
进行优化。
代码如下:
#import "MotorViewController.h"
@interface MotorViewController()
@property (nonatomic, strong) NSTimer *counterTimer;
@end
@implementation MotorViewController
{
int _count;
}
- (void)viewDidLoad
{
_count = 0;
}
// called from the 6th button action method (code is implied)
- (void)setupTimerForCalib
{
self.counterTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
target:self
selector:@selector(timerCount)
userInfo:nil
repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:self.counterTimer forMode:NSRunLoopCommonModes];
NSLog(@"timer started");
}
- (void)timerCount {
_count++;
NSLog(@"count: %d", _count);
if (_count == 120) {
_count = 0;
[self.counterTimer invalidate];
NSLog(@"timer ended");
// timer has ended, shut pump A (SALINE) off
[self setPumpInfo:SALINE select:0];
[self runPump];
}
}
我还有一个想要使用这些方法的视图控制器,因此有一个更好的理由是不仅将它们保留在MotorViewController
中。
我应该将这些NSTimer
方法保留在MotorViewController
中,还是为它们创建一个委托类?或者(在网上闲逛了一会之后),设置一个NSNotification
,在2分钟后调用setPumpInfo:select:
和runPump
?
以最佳选择为准,您能否同时解释其他原因。我正在尝试学习有关设计模式的更多信息,并知道如何在正确的场景中使用它们。谢谢!
答案 0 :(得分:1)
我将有一个NSObject
子类为您的泵建模。
我会给它一个setInfo
以及一个run
和stop
方法(至少)。
您的ViewControllers
应该控制视图并与您的模型进行交互,因此他们将创建与其交互的新泵对象(模型)。
现在,您可能想向Pump
中添加另一种方法:runAfterDelay:(NSTimeInterval)delay forDuration:(NSTimeInterval) duration
并将NSTimer
嵌入Pump
类中。
然后您可以按如下方式在视图控制器中使用泵:
-(void) startPump {
[self.pump setInfo:SALINE select:0];
[self.pump runAfterDelay: 120 forDuration: 120];
}
将逻辑保留在视图控制器之外,因此不必复制它。