我应该在视图控制器中编写 NSTimer 代码还是将 class 与 delegation/notification 模式分开?
Should I write NSTimer code in view controller or separate class with either delegation/notification pattern?
我的 MotorViewController
中有 5 个按钮,它们充当 5 个电机的 on/off 开关。按下按钮 A,电机 A 将无限期地 运行,直到您再次按下按钮将其停止。
我刚刚添加了第 6 个按钮,它将告诉电机 A 运行 2 分钟。我在 ViewController
中添加了 NSTimer
代码,一切正常。 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
中,还是为它们创建一个委托 class?或者(在网上浏览了一下之后)设置一个 NSNotification
,在 2 分钟后调用 setPumpInfo:select:
和 runPump
?
无论哪一个是最好的选择,您能否也解释一下其中的原因。我正在努力学习更多关于设计模式的知识,并知道如何在正确的场景中使用它们。谢谢!
我会有一个 NSObject
subclass 模拟你的泵。
我会给它一个 setInfo
和一个 run
和 stop
方法(至少)。
您的 ViewControllers
应该控制视图并与您的模型交互,因此他们会创建与之交互的新泵对象(模型)。
现在,您可能想向 Pump
添加另一种方法:runAfterDelay:(NSTimeInterval)delay forDuration:(NSTimeInterval) duration
并将 NSTimer
嵌入 Pump
class。
然后您可以在视图控制器中使用泵,如下所示:
-(void) startPump {
[self.pump setInfo:SALINE select:0];
[self.pump runAfterDelay: 120 forDuration: 120];
}
将逻辑放在视图控制器之外,这样您就不必复制它。
我的 MotorViewController
中有 5 个按钮,它们充当 5 个电机的 on/off 开关。按下按钮 A,电机 A 将无限期地 运行,直到您再次按下按钮将其停止。
我刚刚添加了第 6 个按钮,它将告诉电机 A 运行 2 分钟。我在 ViewController
中添加了 NSTimer
代码,一切正常。 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
中,还是为它们创建一个委托 class?或者(在网上浏览了一下之后)设置一个 NSNotification
,在 2 分钟后调用 setPumpInfo:select:
和 runPump
?
无论哪一个是最好的选择,您能否也解释一下其中的原因。我正在努力学习更多关于设计模式的知识,并知道如何在正确的场景中使用它们。谢谢!
我会有一个 NSObject
subclass 模拟你的泵。
我会给它一个 setInfo
和一个 run
和 stop
方法(至少)。
您的 ViewControllers
应该控制视图并与您的模型交互,因此他们会创建与之交互的新泵对象(模型)。
现在,您可能想向 Pump
添加另一种方法:runAfterDelay:(NSTimeInterval)delay forDuration:(NSTimeInterval) duration
并将 NSTimer
嵌入 Pump
class。
然后您可以在视图控制器中使用泵,如下所示:
-(void) startPump {
[self.pump setInfo:SALINE select:0];
[self.pump runAfterDelay: 120 forDuration: 120];
}
将逻辑放在视图控制器之外,这样您就不必复制它。