2011-12-27 25 views
6

मैं अपने पहले आईओएस ऐप पर काम कर रहा हूं, और पहले स्नैग में भाग गया हूं, जिसके लिए मुझे कोई अच्छा जवाब नहीं मिला है।उद्देश्य सी और आईओएस: एक टाइमर चल रहा है? एनएसटीमर/थ्रेड/एनएसडीएटी/आदि

समस्या: मेरे पास कस्टम 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 

} 

उत्तर

11

उपयोग एक NSTimer

इसे इस तरह सेट करें:

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

फिर जब आप इसे रद्द करने, कुछ इस तरह करते हैं:

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

ध्यान दें कि उपरोक्त उदाहरण में आपको एनएसटीमर के "द टाइमर" उदाहरण की घोषणा करने की आवश्यकता होगी, जहां यह दोनों विधियों के लिए उपलब्ध होगा। उपर्युक्त उदाहरण में "0.5" का अर्थ है कि टाइमर दूसरे में दो बार आग लग जाएगा। आवश्यकतानुसार समायोजित करें।

+1

नोट: इसे अमान्य करने के बाद टाइमर को शून्य पर सेट करने के लिए अच्छा अभ्यास माना जाता है: [theTimer अमान्य]; theTimer = शून्य; – Groot

1

पूर्णता के लिए, मैं यहाँ अपने अंतिम कार्यान्वयन द्वारा जोड़ा जा रहा (यकीन नहीं इस तरह से यह करने के लिए है, लेकिन यहाँ जाता है)

@interface { 
    NSTimer *myTimer; 
} 

@property (nonatomic, retain) NSTimer *myTimer; 

मीटर

@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]; 
    } 
}