На основе «нажмите», как я могу получить доступ к объекту таймера и остановить обработку - PullRequest
1 голос
/ 17 мая 2011

Да, еще один вопрос новичка - вопрос о процессе / рабочем процессе.Пожалуйста, будьте терпеливы.

У меня есть объект NSTimer, таймер, созданный в одном методе methA и передаваемый в другой метод methB, где он используется для управления некоторой обработкой.Оба метода находятся в одном классе.

У меня есть методы touchesBegin и touchesEnded для захвата пользовательского ввода.Эти методы находятся в одном классе с моими двумя предыдущими методами - metaA и methB.Когда пользователь «нажимает» на мой экран, мне нужно прекратить обработку

Когда мой метод touchesBegin вызывается одним касанием, я предполагаю, что все, что мне нужно сделать, это отправить сообщение другим моим методам, methA / methBи скажите им, чтобы они прекратили обработку.Я предполагаю, что все, что мне нужно сделать, это сделать недействительным таймер, который передается моему методу "обработки", то есть methB.

Это звучит правильно?Я включил мои четыре метода touchBegin, methA и methB.Любой вклад приветствуется.

- (void) methA
{

    stepValue = 0;
    animationBuild = YES;

    float duration = [[[Config shared] valueForKey:@"animation.val.step_duration"] floatValue];

    [NSTimer scheduledTimerWithTimeInterval:duration target:self selector:@selector(stepValue:) userInfo:nil repeats:YES]; 

} 

- (void) methB:(NSTimer *) timer
{
    if (animationBuild)
    {
        // animation logic/processing
    }

    // Next step
    stepValue++;

    if (stepValue == GROUP_SIZE)
    {
        [timer invalidate];

        [self animateShowMessage];

    }
}


- (void) touchesBegan:(NSSet *) touches withEvent:(UIEvent *) event
{
    if (modalDialog)
    {
        return;        
    }

    if (currentTouch == nil)
    {
        UITouch *touch = [[touches allObjects] objectAtIndex:0];

        currentTouch = [touch retain];
    }
}


- (void) touchesEnded:(NSSet *) touches withEvent:(UIEvent *) event
{
    if (modalDialog)
    {
        return;        
    }

    UITouch *touch = [[touches allObjects] objectAtIndex:0];

    if ((touch != nil) && (touch == currentTouch))
    {
        CGPoint touchPoint = [touch locationInView:self.view];

        else if ((CGRectContainsPoint(visRect[[Process shared].procType], point)) && (touch.tapCount == 2))
            {            
                // processing
            }

        else
        {
            // Start a new processing
            [self startNew];
        }

        [currentTouch release];
        currentTouch = nil;        
    }
}

1 Ответ

2 голосов
/ 18 мая 2011

Это, по сути, правильно, но я бы внес пару изменений в дизайн.

Если вы не создаете приложение для пред-iOS 3.x, вы должны использовать UIGestureRecognizer для распознавания нажатийстаршее касается подхода начала.Использовать распознаватель очень просто:

UITapGestureRecognizer *tapRecognizer = 
   [[[UITapGestureRecognizer alloc] initWithTarget:self 
                                    action:@selector(handleTap:)] autorelease];
[self.view addGestureRecognizer:tapRecognizer];


Как правило, я не люблю, чтобы в моем коде было более одного места, чтобы я мог изменить таймер.Если у вас есть изменения таймера, разбросанные по всему коду, вы, вероятно, пропустите аннулирование или освобождение где-то.Итак, я обычно создаю свойство таймера, как в примере ниже.Если вы используете свойство, подобное этому, изменение объекта таймера или установка значения таймера на ноль автоматически сделает его недействительным, поэтому гарантированно никогда не будет в стиле фанк.

- (void)setTimer:(NSTimer *)newTimer {
    [_timer invalidate];
    [newTimer retain];
    [_timer release];
    _timer = newTimer;
}
...