目标C& iOS:运行计时器?的NSTimer /主题/的NSDate的/ etc

时间:2011-12-27 02:48:46

标签: objective-c ios nsdate nstimer nsthread

我正在开发我的第一个iOS应用程序,并且遇到了第一个障碍,我找不到合适的答案。

问题:我有一个自定义UIGestureRecognizer,并且所有内容都已正确连接,我可以在识别后的@selector中为每次触摸运行代码。这对大多数事情来说都很好,但对其他人来说这是一个太多的输入。

我的目标:制作一个以指定间隔触发的计时器来运行逻辑,并在触摸被取消时取消它。

为什么我在这里问:解决方案有很多可能性,但没有一个能够最好地实现。到目前为止似乎是

  • performSelector(及其中的一些变体)
  • NSThread
  • NSTimer
  • NSDate
  • 操作队列
  • 我想我也发现了其他一些......

从所有的研究中,某种形式的线索似乎是可行的路线,但我不知道哪种方式最适合这种情况。

实现的示例:每0.10秒采用NSPoint,并且采用前一点和当前点之间的距离。 [取每个点之间的距离产生非常混乱的结果]。

相关代码:

- (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 个答案:

答案 0 :(得分:11)

使用NSTimer

像这样设置:

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

然后当你想取消它时,做这样的事情:

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

请注意,在上面的示例中,您需要声明NSTimer的“theTimer”实例,它可用于两种方法。在上面的例子中,“0.5”表示计时器每秒会发射两次。根据需要进行调整。

答案 1 :(得分:1)

为了完整起见,我在这里添加了我的最终实现(不确定这是做到这一点的方法,但是这里有)

的.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];
     }
}