2010-04-26 19 views
8

नोट: शायद मेरे संपादन को पढ़ने के लिए स्क्रॉल करना उचित है।एक अलग धागे में एक एनएसटीमर को

मैं एक अलग धागे में एक एनएसटीमर स्थापित करने की कोशिश कर रहा हूं ताकि उपयोगकर्ता मेरे आवेदन के यूआई के साथ बातचीत कर सकें। ऐसा लगता है, लेकिन लीक्स कई मुद्दों की रिपोर्ट करता है - और मेरा मानना ​​है कि मैंने इसे अपने टाइमर कोड पर सीमित कर दिया है।

वर्तमान में क्या हो रहा है यह है कि अद्यतन टिमर एक एनएसएआरएआर कंट्रोलर (टाइमर कंट्रोलर) तक पहुंचने का प्रयास करता है जो मेरे अनुप्रयोग इंटरफ़ेस में एनएसटीबल व्यू से जुड़ा हुआ है। वहां से, मैं पहली चयनित पंक्ति को पकड़ता हूं और अपना समय बदलता हूं। नोट: टाइमर नियंत्रक की सामग्री कोर डेटा के माध्यम से जेनरेट की गई प्रबंधित वस्तुओं का संग्रह है।

आसपास पढ़ने से, मुझे विश्वास है कि मुझे क्या करने की कोशिश करनी चाहिए, मेरे टाइमर माध्यमिक धागे की बजाय मुख्य थ्रेड पर अद्यतन टिमर फ़ंक्शन निष्पादित करना है।

मैं उम्मीद में यहां पोस्ट कर रहा हूं कि अधिक अनुभव वाला कोई व्यक्ति मुझे बता सकता है कि क्या यह एकमात्र चीज है जो मैं गलत कर रहा हूं। थ्रेडिंग पर ऐप्पल के दस्तावेज़ीकरण को पढ़ने के बाद, मुझे यह एक बहुत बड़ा विषय क्षेत्र मिला है।

NSThread *timerThread = [[[NSThread alloc] initWithTarget:self selector:@selector(startTimerThread) object:nil] autorelease]; 
[timerThread start]; 

-(void)startTimerThread 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; 
    activeTimer = [[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTimer:) userInfo:nil repeats:YES] retain]; 

    [runLoop run]; 
    [pool release]; 
} 
-(void)updateTimer:(NSTimer *)timer 
{ 
    NSArray *selectedTimers = [timersController selectedObjects]; 
    id selectedTimer = [selectedTimers objectAtIndex:0]; 
    NSNumber *currentTimeSpent = [selectedTimer timeSpent]; 

    [selectedTimer setValue:[NSNumber numberWithInt:[currentTimeSpent intValue]+1] forKey:@"timeSpent"]; 
} 
-(void)stopTimer 
{ 
    [activeTimer invalidate]; 
    [activeTimer release]; 
} 

अद्यतन

मैं अभी भी पूरी तरह से इस रिसाव के संबंध में खो रहा हूँ। मुझे पता है कि मैं स्पष्ट रूप से कुछ गलत कर रहा हूं, लेकिन मैंने अपना आवेदन अपनी नंगे हड्डियों तक छीन लिया है और अभी भी इसे ढूंढ नहीं पाया जा सकता है। सादगी के लिए, मैंने अपने अनुप्रयोग नियंत्रक कोड को अपलोड किया है: a small pastebin। ध्यान दें कि मैंने अब टाइमर थ्रेड कोड हटा दिया है और इसके बजाय टाइमर को एक अलग रनलोप में चलाने का विकल्प चुना है (जैसा कि यहां बताया गया है)।

अगर मैं सेट लीक कॉल ट्री दोनों गुम प्रतीक और सिस्टम पुस्तकालय को छुपाने के लिए, मैं निम्नलिखित उत्पादन से पता चला है:

संपादित करें: स्क्रीनशॉट टूट और वजह से हटाया को लिंक।

+0

आप अतिरिक्त रन लूप क्यों सेट अप करते हैं? आपका टाइमर आम तौर पर मुख्य रन लूप के साथ ठीक काम कर सकता है। – zneak

+0

पेस्टबिन लिंक मर चुका है। –

उत्तर

51

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

NSTimer *uiTimer = [NSTimer timerWithTimeInterval:(1.0/5.0) target:self selector:@selector(uiTimerFired:) userInfo:nil repeats:YES];  
[[NSRunLoop mainRunLoop] addTimer:uiTimer forMode:NSRunLoopCommonModes]; 

के परिशिष्ट के रूप में इस जवाब में यह अब संभव है ग्रांड सेंट्रल डिस्पैच का उपयोग कर टाइमर और ब्लॉक शेड्यूल करने के लिए:

// Update the UI 5 times per second on the main queue 
// Keep a strong reference to _timer in ARC 
_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue()); 
dispatch_source_set_timer(_timer, DISPATCH_TIME_NOW, (1.0/5.0) * NSEC_PER_SEC, 0.25 * NSEC_PER_SEC); 

dispatch_source_set_event_handler(_timer, ^{ 
    // Perform a periodic action 
}); 

// Start the timer 
dispatch_resume(_timer); 

बाद में टाइमर अब जरूरत होती है जब:

dispatch_source_cancel(_timer); 
+0

यह एक बहुत ही आसान समाधान है, धन्यवाद। मैंने अभी रनूप्स पर पढ़ने का थोड़ा सा समय बिताया है। दुर्भाग्यवश, यह मेरी रिसाव में मदद नहीं करता है। मैंने इसे अद्यतन टिमर फ़ंक्शन में एक समस्या (मुझे विश्वास है) को संकुचित कर दिया है। मेरा मानना ​​है कि यह समय के साथ कुछ करने के लिए है, मैं प्रबंधित ऑब्जेक्ट्स के अपने एनएसएआरएआरई के भीतर समय सांप चर बदल रहा हूं। – ndg

+0

यदि आपके द्वारा ऊपर पोस्ट किया गया कोड आपका वास्तविक अपडेट टिमर फ़ंक्शन है, तो यह मेरे लिए ठीक दिखता है। एक बार जब आप इसे अमान्य कर देते हैं, तो आपको टाइमर जारी न करने के लिए सावधान रहना होगा। – sbooth

+0

यह वास्तव में मेरा वास्तविक अपडेट टाइमर फ़ंक्शन है।मैंने ओपी को उन मुद्दों को सारांशित करने के लिए अपडेट किया है जिन्हें मैं देख रहा हूं (और इस्तेमाल किए गए कोड पर अपडेट देने के लिए)। – ndg

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