Должен ли я написать код NSTimer в контроллере представления или отдельном классе с шаблоном делегирования / уведомления? - PullRequest
0 голосов
/ 07 мая 2019

В моем MotorViewController есть 5 кнопок, которые действуют как выключатели для 5 двигателей. Нажмите кнопку A, двигатель A будет работать бесконечно, пока вы не нажмете кнопку еще раз, чтобы остановить его.

Я только что добавил 6-ю кнопку, которая сообщает двигателю А работать в течение 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?

Какой бы ни был лучший вариант, не могли бы вы объяснить причину этого по сравнению с другим. Я пытаюсь узнать больше о шаблонах проектирования и знать, как использовать их в правильных сценариях. Спасибо!

1 Ответ

1 голос
/ 09 мая 2019

Я бы имел подкласс 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];
}

Не допускайте попадания логики в контроллеры представления, чтобы вам не приходилось копировать ее.

...