2012-05-26 13 views
8

स्क्रॉल करते समय कहा जाता है नहीं हो रहा है एक NSTimerNSTimer आवधिक कार्य

timer = [NSTimer scheduledTimerWithTimeInterval:1 
             target:self 
             selector:@selector(periodicTimer) 
             userInfo:nil 
             repeats:YES]; 

जो

- (void)periodicTimer 
{ 
    NSLog(@"Bang!"); 
    if (timerStart != nil) 
     [timerLabel setText:[[NSDate date] timeDifference:timerStart]];   
} 

समस्या यह है कि एक tableview स्क्रॉल (या अन्य कार्य करने) लेबल, जबकि नहीं करता करता है अपडेट नहीं किया जाएगा, इसके अलावा, "बैंग!" प्रकट नहीं होता है, इसलिए मुझे लगता है कि विधि को बुलाया नहीं जाता है।

मेरा प्रश्न लेबल समय-समय पर यहां तक ​​कि जब उपयोगकर्ता एप्लिकेशन इंटरफेस के साथ चारों ओर खेल रहा है अद्यतन करने के लिए कैसे है।

+0

कोड सभी 'वास्तव में ऊपर periodicTimer' में दिखाया गया है कि समय-समय पर होता है? आपको बस एक लेबल प्रदर्शित करने की आवश्यकता है जो एक समय प्रदर्शित करता है? या पृष्ठभूमि पृष्ठभूमि प्रसंस्करण में शामिल है? – Nate

+0

यह सब है कि समय-समय पर होता है (NSLog सिर्फ एक परीक्षण देखने के लिए विधि कहा जाता है कम से कम हो जाता है) था – Fr4ncis

उत्तर

24

आप UITrackingRunLoopMode करने के लिए अपने टाइमर जोड़ने के लिए सुनिश्चित करें कि आपके टाइमर भी स्क्रॉल दौरान आग बनाने की आवश्यकता होगी।

NSRunLoop *runloop = [NSRunLoop currentRunLoop]; 
NSTimer *timer = [NSTimer timerWithTimeInterval:0.1 target:self selector:@selector(myTimerAction:) userInfo:nil repeats:YES]; 
[runloop addTimer:timer forMode:NSRunLoopCommonModes]; 
[runloop addTimer:timer forMode:UITrackingRunLoopMode]; 

से: https://stackoverflow.com/a/1997018/474896

+0

हां, इस समस्या को संभालने का यह सही तरीका है। पोस्टर ने जवाब देने से पहले मैंने अपने समाधानों को प्रोटोटाइप करना शुरू कर दिया था कि सवाल पूछने के लिए उसका आवधिक टाइमर फ़ंक्शन एक सरलीकरण नहीं था, लेकिन वास्तव में टेक्स्ट लेबल बदलने के अलावा उसके पास कुछ भी नहीं चल रहा था। इसलिए, यूआई अपडेट के रूप में पृष्ठभूमि कार्य का उपयोग करने की कोई ज़रूरत नहीं है। +1 – Nate

+5

एफवाईआई - एनएसआरन लूप कॉमॉन मोड में आईओएस 7 के रूप में UITrackRunLoopMode शामिल है –

-2

इस एक के बारे में सुनिश्चित नहीं हैं, लेकिन मेरा पहला अनुमान होगा कि मुख्य थ्रेड जिस पर इंटरफ़ेस आपके टाइमर गाया जा रहा है सिर्फ इसके इंटरफेस को अपडेट करते समय कुछ भी करने का मौका नहीं मिलता है।

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

+0

कार्यक्षमता टाइमर ही है। मुझे लगता है कि यह एनएसटीमर के बारे में कोई समस्या नहीं है, जबकि मुख्य धागा यूआई स्क्रॉलिंग का ख्याल रख रहा है। – Fr4ncis

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