2012-01-20 14 views
11

मैं पृष्ठभूमि में चलाने के लिए एक ऐप विकसित कर रहा हूं। यह एक स्थान आधारित ऐप है, इसलिए यह हर समय चलता है, ओएस इसे मार नहीं देता है।आईफोन - पृष्ठभूमि में एनएसटीमीटर

इसे प्रत्येक 10 सेकंड (केवल डीबगिंग के लिए) कुछ जानकारी भेजनी चाहिए, मैंने पृष्ठभूमि में एक बार टाइमर सेट किया है। मैंने फ़ंक्शन में ब्रेकपॉइंट सेट किया है जिसे प्रत्येक 10 सेकेंड को निष्पादित किया जाना चाहिए, जिसे कभी नहीं कहा जाता है, लेकिन अगर मैं ऐप को रोकता हूं और फिर टाइमर को जारी रखता हूं, और फिर टाइमर को हर 10 सेकेंड को बिना किसी समस्या के निष्पादित किया जाता है, अजीब सही?

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

मेरा प्रश्न क्यों है ?? टाइमर सही ढंग से सेट किया गया है (मुझे लगता है) क्योंकि यह रुकने के बाद काम करता है, लेकिन ऐसा नहीं है।

कोई विचार?

तरह से मैं टाइमर सेट है:

self.timer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(doStuff) userInfo:nil repeats:YES]; 

और समारोह में मैं एक वेब सेवा से कनेक्ट करें।

धन्यवाद।

+0

यह टाइमर के बारे में है, डीबगिंग नहीं; अपने शीर्षक को ठीक करें, कृपया। और यह "उद्देश्य-सी" है जो आप इस प्रश्न को टैग करने के लिए सबसे अच्छा कर सकते हैं? – matt

+0

पृष्ठभूमि में चल रहे [NSTimers] के संभावित डुप्लिकेट?] (Http://stackoverflow.com/questions/5901398/nstimers-running-in-background) – matt

उत्तर

20

मेरे पास एक समान ऐप डिज़ाइन है और एक ही चीज़ पर फंस गया था। क्या मैंने कहीं इंटरनेट पर पाए इस ओएस कि आप अभी भी बातें जा रहा है और नहीं इसे रोकने के लिए है बताता बयान applicationDidEnterBackground:

UIBackgroundTaskIdentifier locationUpdater =[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
     [[UIApplication sharedApplication] endBackgroundTask:locationUpdater]; 
     locationUpdater=UIBackgroundTaskInvalid; 
    } ]; 

के इस प्रकार जोड़ने है।

मैं अपने टाइमर इस समारोह

//this is a wrapper method to fit the required selector signature 
- (void)timeIntervalEnded:(NSTimer*)timer { 
    [self writeToLog:[NSString stringWithFormat:@"Timer Ended On %@",[NSDate date]]]; 
    [self startReadingLocation]; 
    [timer invalidate]; 
    timer=nil; 
} 

मैं अपने मेरे स्थान प्रबंधक प्रतिनिधि तरीकों में टाइमर सेट से जुड़ा है।

मुझे आपका दर्द महसूस होता है। मैंने पाया कि ये चीजें सुपर परिष्कृत थीं। इसी से मेरा काम बना है। मुझे उम्मीद है यह मदद करेगा। मैंने पाया है कि पृष्ठभूमि में आप क्या कर सकते हैं में कोई वास्तव में प्रतिबंध नहीं है।

+0

बहुत बहुत धन्यवाद cwieland, यह पूरी तरह से काम किया। – subharb

+0

दरअसल यह मेरी पूरी समस्या को ठीक नहीं करता है। अब मुझे एक क्रैश लॉग मिलता है, जाहिर है क्योंकि मैं पृष्ठभूमि कार्य को समाप्त नहीं करता हूं, और ऐसा इसलिए है क्योंकि जब तक ऐप पृष्ठभूमि में नहीं होता तब तक कार्य कभी खत्म नहीं होना चाहिए। एनस्टीमर अंततः दोहराएगा। क्या यह संभव है? या चूंकि यह एक स्थान ऐप है, इसलिए मुझे क्रियाओं को जीपीएस में जोड़ना चाहिए? – subharb

+0

मुझे बिल्कुल यकीन नहीं है कि दुर्घटना क्या है। मैं पृष्ठभूमि में सॉकेट कनेक्शन बनाए रखने में सक्षम हूं इसलिए मुझे पूरा यकीन है कि आप केवल स्थान आधारित चीज़ों तक ही सीमित नहीं हैं। लेकिन जैसा कि मैंने कहा था कि इन समस्याओं को हल करने के लिए सबसे आसान नहीं है। क्षमा करें मैं और अधिक मदद नहीं कर सका। मेरा टाइमर अंतहीन रूप से चलाएगा (जहां तक ​​मैंने देखा है) जांच करने के लिए एक चीज पृष्ठभूमि को प्रिंट कर रही है टाइममेमिंग (इसे कभी नीचे नहीं जाना चाहिए और बहुत बड़ा होना चाहिए) – utahwithak

0

पृष्ठभूमि में आप क्या कर सकते हैं इस पर प्रतिबंध हो सकते हैं। पृष्ठभूमि में जाने से पहले रन लूप में टाइमर जोड़ने का प्रयास करें। यहां तक ​​कि काम नहीं कर सकता है; यह हो सकता है कि पृष्ठभूमि में आपके द्वारा चलाया जा सकने वाला एकमात्र कोड कोर कोड विधियों द्वारा कोड किया गया कोड है (उदा। locationManager:didUpdate...)। लेकिन मेरी धारणा यह है कि पृष्ठभूमि में जाने से पहले टाइमर पहले ही चल रहे हैं।

+0

लेकिन यह समझ में नहीं आता है कि क्यों मैं इसे डीबग करता हूं। मैं यही समझ नहीं पा रहा हूं। मुझे लगता है कि ऐप डिबगिंग या बस – subharb

+0

चला रहा है, मेरा मानना ​​है कि अगर आपने जो सुझाव दिया था (मैंने अभी भी अग्रभूमि में टाइमर सेट किया है) तो यह समस्या हल हो गई होगी। यह वास्तव में आपके द्वारा स्वीकार किए गए समाधान के समान ही है। आपकी समस्या यह थी कि आप पहले ही पृष्ठभूमि में थे और टाइमर सेट करने से पहले आपका रनलोप चलना बंद कर दिया था। ब्रेकपॉइंट पर रुकने और पृष्ठभूमि के दौरान फिर से शुरू होने से आपके रनलोप को चलाने का एक नया मौका मिलता है, इसलिए उस समय टाइमर रनलॉप में जोड़ा गया था। यह अनुमान है लेकिन मेरा मानना ​​है कि यह घटना को समझाता है। – matt

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