Цель C & iOS: запустить таймер?NSTimer / Нитки / NSDate / и т.д. - PullRequest
6 голосов
/ 27 декабря 2011

Я работаю над своим первым приложением для iOS и запустил первую загадку, для которой я не смог найти хорошего ответа.

Проблема: у меня есть пользовательский UIGestureRecognizer, и все правильно настроено, и я могу выполнять код для каждого касания в @selector после распознавания. Это было хорошо для большинства вещей, но это слишком много для других.

Моя цель: создать таймер, который срабатывает с заданным интервалом для запуска логики, и иметь возможность отменить это в тот момент, когда касания отменяются.

Почему я спрашиваю здесь: есть много возможностей для решений, но ни одна из них не является лучшей для реализации. Пока что похоже на

  • performSelector (и некоторые варианты этого)
  • NSThread
  • NSTimer
  • NSDate
  • Очереди операций
  • Мне кажется, я нашел и других ...

Из всех исследований кажется, что какой-то способ создания нити - это путь, но я в недоумении, и он лучше всего подойдет для этой ситуации.

Пример реализации: NSPoint берется каждые 0,10 секунды, и берется расстояние между предыдущей и текущей точкой. [Проведение расстояния между каждой точкой давало очень грязные результаты].

Соответствующий код:

- (void)viewDidLoad {
 CUIVerticalSwipeHold *vSwipe =
 [[CUIVerticalSwipeHold alloc]
 initWithTarget:self 
 action:@selector(touchHoldMove:)];
 [self.view addGestureRecognizer:vSwipe];
 [vSwipe requireGestureRecognizerToFail:doubleTap];
}

...

- (IBAction)touchHoldMove:(UIGestureRecognizer *)sender {
     if (sender.state == UIGestureRecognizerStateEnded) {

     }

     if (sender.state == UIGestureRecognizerStateBegan) {

     }

     //other stuff to do goes here

}

Ответы [ 2 ]

11 голосов
/ 27 декабря 2011

Используйте NSTimer

Настройте это так:

    theTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(yourMethodThatYouWantRunEachTimeTheTimerFires) userInfo:nil repeats:YES];

Затем, когда вы хотите отменить это, сделайте что-то вроде этого:

    if ([theTimer isValid])
{
    [theTimer invalidate];
}

Обратите внимание, что в приведенном выше примере вам нужно будет объявить экземпляр "theTimer" NSTimer, где он будет доступен обоим методам. В приведенном выше примере «0,5» означает, что таймер будет срабатывать дважды в секунду. Отрегулируйте при необходимости.

1 голос
/ 03 января 2012

Ради полноты я добавляю здесь свою окончательную реализацию (не уверен, что это способ сделать это, но здесь идет речь)

.h

@interface {
    NSTimer *myTimer;
}

@property (nonatomic, retain) NSTimer *myTimer;

.m

@synthesize myTimer;   

-------------------------------------------

- (void)viewDidLoad {
 //Relevant snipet
 CUIVerticalSwipeHold *vSwipe =
 [[CUIVerticalSwipeHold alloc]
 initWithTarget:self 
 action:@selector(touchHoldMove:)];
 [self.view addGestureRecognizer:vSwipe];
 [vSwipe requireGestureRecognizerToFail:doubleTap];
 }

-------------------------------------------

- (IBAction)touchHoldMove:(UIGestureRecognizer *)sender {
     if (sender.state == UIGestureRecognizerStateEnded) {
         //Cancel the timer when the gesture ends
         if ([myTimer isValid])
            {
                [myTimer invalidate];
            }
         }
     }

     if (sender.state == UIGestureRecognizerStateBegan) {
        //starting the timer when the gesture begins
        myTimer = [NSTimer scheduledTimerWithTimeInterval:someTimeIncrement  
                                                   target:self
                                                 selector:@selector(someSelector) 
                                                 userInfo:nil 
                                                  repeats:YES];
     }
}
...