2011-12-27 20 views
6

Tôi đang làm việc trên ứng dụng iOS đầu tiên của mình và đã chạy trong lần tìm kiếm đầu tiên Tôi không thể tìm thấy câu trả lời hay cho.Mục tiêu C & iOS: chạy bộ hẹn giờ? NSTimer/Chủ đề/NSDate/etc

Vấn đề: Tôi có một tùy chỉnh UIGestureRecognizer và để tất cả có dây đúng cách và tôi có thể chạy mã cho mỗi lần chạm trong số @selector sau khi nhận dạng. Điều này đã được tốt cho hầu hết mọi thứ, nhưng đó là một chút quá nhiều đầu vào cho người khác.

Mục tiêu của tôi: Để tạo bộ hẹn giờ kích hoạt tại một khoảng thời gian được chỉ định để chạy logic và để có thể hủy tính năng này tại thời điểm chạm bị hủy.

Tại sao tôi hỏi ở đây: Có rất nhiều khả năng cho các giải pháp, nhưng không có giải pháp nào nổi bật là tốt nhất để triển khai. Cho đến nay nó có vẻ như

  • performSelector (và một số biến thể về vấn đề này)
  • NSThread
  • NSTimer
  • NSDate
  • Operation Queues
  • Tôi nghĩ rằng tôi thấy một số người khác cũng ...

Từ tất cả các nghiên cứu, một số hình thức làm cho một sợi có vẻ là con đường để đi, nhưng tôi đang ở một mất mát mà tại đó sẽ làm việc tốt nhất cho tình trạng này.

Ví dụ về triển khai: NSPoint được thực hiện sau mỗi 0.10 giây và khoảng cách giữa điểm trước đó và điểm hiện tại được thực hiện. [Lấy khoảng cách giữa mọi điểm đã mang lại kết quả rất lộn xộn].

Mã liên quan:

- (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 

} 

Trả lời

11

Sử dụng một NSTimer

Set nó lên như thế này:

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

Sau đó, khi bạn muốn hủy bỏ nó, làm một cái gì đó như thế này:

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

Lưu ý rằng trong ví dụ trên, bạn sẽ cần phải khai báo cá thể "theTimer" của NSTimer, nơi nó sẽ có sẵn cho cả hai phương thức. Trong ví dụ trên, "0,5" có nghĩa là bộ hẹn giờ sẽ kích hoạt hai lần trong một giây. Điều chỉnh khi cần.

+1

Lưu ý: Nó được coi là thực hành tốt để thiết lập bộ đếm thời gian để không sau khi vô hiệu hóa nó: [theTimer invalidate]; theTimer = nil; – Groot

1

Vì lợi ích của sự hoàn chỉnh, tôi đang bổ sung thêm thực hiện cuối cùng của tôi ở đây (không chắc chắn đây là cách để làm điều đó, nhưng ở đây đi)

.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]; 
    } 
} 
Các vấn đề liên quan