2014-01-30 1 views
0

У меня есть приложение, которое, когда пользователь прикасается к определенному объекту, запускаю селектор через задержку. Я не уверен, что хочу или нуждаюсь в задержке, но не уверен в лучшей практике, может быть, в очереди? Во всяком случае, вот что мне нужно, независимо от того, что у меня есть сейчас.Соответствующий способ вызова и отмены выбора в Objective-c?

ЧТО Я теперь

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(doSomething) object:self]; 
[self performSelector:@selector(doSomething) withObject:nil afterDelay:2.0]; 

Когда пользователь прикасается определенный объект Мне нужно стартовое метод, но, если он/она снова касается объекта, я хочу, чтобы не вызвать метод.

Используйте случай # 1:

  1. прикосновений пользователя объекта
  2. Пользователь ничего не делает в течение 2 секунд
  3. вызова селектор

Используйте случай # 2:

  1. Пользователь касается объекта, то
  2. прикосновения пользователя объекта .5 секунд (таким образом отменить вызов селектора)
  3. прикосновения пользователя объекта .3 секунд (таким образом отменить вызов селектора)
  4. прикосновения пользователя объекта .9 секунд (таким образом отменить вызов селектора)
  5. Пользователь ничего не трогать в течение 2-х секунд
  6. селекторных вызовов

Если чувствуете, как performSelector и cancelPrevious являются Hacky. Должен ли я использовать какую-то очередь и затем очищать очередь каждый раз, когда пользователь снова коснется?

Или использовать таймер и просто перезапускать таймер каждый раз, когда пользователь его касается?

+0

Хотя я полагаю, что таймер - это то, что делает peformselector под ним. – jdog

+0

Я предлагаю вам использовать _timer_ вместе с некоторым _boolean flag_. Этот метод тригеррован через две секунды, то есть когда таймер выключается. – GoGreen

+0

Да, вы правы. Используйте флаг boolean, который переключает его значение в каждом клике. и выполнить действие в методе, только если флаг имеет значение true. – GoGreen

ответ

0

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

@interface ViewController() 
{ 
    NSTimer *timer; 
    NSInteger seconds; 
} 
@end 

- (IBAction)start:(id)sender 
{ 
    seconds = 5; 
    [timer invalidate]; 
    timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(execute) userInfo:nil repeats:YES]; 
} 

- (void)execute 
{ 
    if(seconds > 0) { 
     NSLog(@"seconds: %li", (long)seconds); 
     seconds--; 
    } 
    else { 
     NSLog(@"fire"); 
     [timer invalidate]; 
    } 
} 
+0

Итак, после некоторых исследований выполнить выборэлемент afterDelay создает под ним NSTimer, поэтому он делает именно это. – jdog