2011-07-13 25 views
6

संभव डुप्लिकेट:
UIScrollView pauses NSTimer until scrolling finishesUIWebView आईफोन में स्क्रॉल करते समय टाइमर क्यों रुकता है?

मैं क्यों NSTimer जैसे ही मैं UIWebView में स्क्रॉल के रूप में बंद हो जाता है मुसीबत पता लगाना का एक सा हो रहा है। कृपया निम्नलिखित कोड पर एक नज़र डालें (मैं जानता हूँ कि यह एक होमवर्क साइट नहीं है, लेकिन मैं ईमानदारी से अटक कर रहा हूँ):

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSString *address = @"http://en.m.wikipedia.org/wiki/"; 
    NSURL *url = [NSURL URLWithString:address]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    [wiki loadRequest:request]; 
    time = 0; 
    countValue = 0; 
    timer = [NSTimer scheduledTimerWithTimeInterval: 0.1 target: self selector: @selector(updateTimer) userInfo: nil repeats: YES]; 
    timeRand = 0; 
    countValueRand = 1; 
    randomTimer = [NSTimer scheduledTimerWithTimeInterval: 0.1 target: self selector: @selector(updateRandomTimer) userInfo: nil repeats: YES]; 
    [self generateWordsArray]; 
} 
+1

कुछ भी नहीं वास्तव में समस्या पैदा करने वाले, कैसे देखते हैं अपने '- (शून्य) updateTimer' और' - (शून्य) updateRandomTimer':

तो आप अपने टाइमर प्रारंभ के बाद, यह NSRunLoopCommonModes में जोड़ने के लिए? क्या आपके टाइमर को रोकना कुछ हो सकता है? क्या आप वाकई स्क्रॉलिंग टाइमर को रोक रहे हैं? –

+1

स्टॉप या देरी? –

+0

हाय, आपकी मदद के लिए बहुत बहुत धन्यवाद, हालांकि मुझे यकीन है कि वेबव्यू टाइमर को काम करने से रोकता है ... – dyang

उत्तर

28

आपको टाइमर को किसी अन्य RunLoopMode में जोड़ना होगा। डिफ़ॉल्ट रूप से एक टाइमर NSDefaultRunLoopMode में जोड़ा जाता है। इसका मतलब है कि टाइमर केवल तब निष्पादित होता है जब ऐप का रन लूप NSDefaultRunLoopMode में होता है।

अब, जब कोई उपयोगकर्ता स्क्रीन को छूता है (उदा। UIScrollView को स्क्रॉल करने के लिए) रन लूप का मोड NSEventTrackingRunLoopMode पर स्विच किया जाएगा। और अब, कि रन लूप अब NSDefaultRunMode में नहीं है, टाइमर निष्पादित नहीं होगा। इसका बदसूरत प्रभाव यह है कि जब भी उपयोगकर्ता स्क्रीन को छूता है तो टाइमर अवरुद्ध होता है। और जब उपयोगकर्ता स्क्रॉल कर रहा है तो यह एक लंबा समय हो सकता है, क्योंकि स्क्रॉलिंग पूरी तरह से बंद होने तक टाइमर अवरुद्ध हो जाता है। और जब उपयोगकर्ता स्क्रॉल करना जारी रखता है, टाइमर फिर से अवरुद्ध होता है।

सौभाग्य से इस समस्या का समाधान काफी सरल है: आप अपना टाइमर किसी अन्य NSRunLoopMode में जोड़ सकते हैं। जब NSRunLoopCommonModes में टाइमर जोड़ें, तो यह सभी रन लूप मोड (जिसे "सामान्य" मोड के सेट के सदस्य के रूप में घोषित किया गया है, सटीक होने के लिए) निष्पादित किया जाएगा। इसका मतलब है कि टाइमर न केवल NSDefaultRunLoopMode में काम कर रहा है बल्कि NSEventTrackingRunLoopMode में भी है (जब उपयोगकर्ता स्क्रीन को छूता है)। यहाँ

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

आप, मेरे दोस्त, भयानक फटकार रहे हैं! – dyang

+0

मेरे दोस्त भी !! –

1

खैर उपयोगकर्ता संपर्क ब्लॉक मुख्य थ्रेड तो टाइमर देरी हो रही है के रूप में यह अपने आप में जोड़ता है वर्तमान धागा के रन लूप।

यदि आप टाइमर को उपयोगकर्ता इंटरैक्शन के बावजूद बुलाया जाना चाहते हैं, तो आपको उस थ्रेड पर टाइमर को जोड़ने और टाइमर को जोड़ने पर विचार करना चाहिए।

आप GCD based timerमाइक एश पर भी देख सकते हैं जो पृष्ठभूमि में चलाएगा। आपको याद रखना चाहिए कि यूआई अपडेट मुख्य धागे पर किया जाना चाहिए।

+0

आपकी मदद के लिए बहुत बहुत धन्यवाद! – dyang

संबंधित मुद्दे