2011-08-14 13 views
6

स्क्रॉल करते समय NSTimer को रोकता है मेरे पास UIScrollView है जिसमें लेबल की एक श्रृंखला है जो तेजी से संख्याओं को अद्यतन कर रही है (प्रत्येक .06 सेकंड)। जबकि स्क्रॉल व्यू चल रहा है, हालांकि, NSTimer रोका गया है और स्क्रॉलिंग के बाद तक जारी नहीं है और लोचदार एनीमेशन समाप्त हो गया है।UIScrollView

मैं इस से कैसे बच सकता हूं और स्क्रॉल व्यू की स्थिति के बावजूद NSTimer चला सकता हूं?

उत्तर

22

इसे ठीक करने का एक आसान तरीका mainRunLoop पर जोड़ रहा है।

[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 

सभी चलाने पाश मोड जिस पर यह स्थापित किया गया है से एक टाइमर को निकालने के लिए टाइमर के लिए एक invalidate संदेश भेजें।

+0

तो आप इस तरह का GCD आधारित टाइमर प्रणाली का उपयोग कर सकते हैं टाइमर को आग लगाने के लिए, जब यह लाइन निष्पादित की जाती है, तो यह शुरू होता है, सही? –

+0

प्रलेखन से: "आप कई इनपुट मोड में टाइमर जोड़ सकते हैं। निर्दिष्ट मोड में चलते समय, रिसीवर टाइमर को इसकी निर्धारित अग्नि तिथि पर या उसके बाद आग लगने का कारण बनता है। फायरिंग पर, टाइमर अपने संबंधित हैंडलर रूटीन को आमंत्रित करता है, जो टाइमर एक निर्दिष्ट वस्तु पर एक चयनकर्ता है। " 'वर myInterval: –

0

(स्विफ्ट) एक वैकल्पिक:

class GCDTimer { 

    private var _timer : dispatch_source_t? 

    init() { 

    } 

    private func _createTheTimer(interval : Double, queue : dispatch_queue_t, block : (() -> Void)) -> dispatch_source_t 
    { 
     let timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); 
     if (timer != nil) 
     { 
      dispatch_source_set_timer(timer, dispatch_time(DISPATCH_TIME_NOW, Int64(interval * Double(NSEC_PER_SEC))), UInt64(interval * Double(NSEC_PER_SEC)), (1 * NSEC_PER_SEC)/10); 
      dispatch_source_set_event_handler(timer, block); 
      dispatch_resume(timer); 
     } 
     return timer; 
    } 


    func start(interval : Double, block : (() -> Void)) 
    { 
     let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 

     _timer = _createTheTimer(interval, queue: queue, block: block) 

    } 

    func stop() 
    { 
     if (_timer != nil) { 
      dispatch_source_cancel(_timer!); 
      _timer = nil; 
     } 
    } 
} 
+0

यहाँ कैसे आप इसका इस्तेमाल होता है GCDTimer = GCDTimer() myInterval.start (1.0) { println (" lol ") }' – Thyselius

+0

आप का उपयोग कर एक यूआई तत्व के लिए एक अद्यतन बनाना चाहते हैं इस टाइमर, आप मुख्य थ्रेड पर इस करना चाहिए, इस तरह: 'dispatch_async (dispatch_get_main_queue(), { \t \t \t \t \t \t self.myUIImageView.image = UIImage (डेटा:! NSData के रूप में डेटा) \t \t \t \t \t}) ' – Thyselius

+0

खुश है कि आपको यह उपयोगी लगता है! – raf

1
तेजी के लिए

:

NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes) 
इस मैं वास्तव में जरूरत नहीं है के साथ