6

मेरे पास कुछ लंबी चल रही प्रक्रिया है जिसे मैं पृष्ठभूमि में चला जाता हूं, भले ही मैं दौड़ना चाहता हूं। मैं एप्लिकेशन की beginBackgroundTaskWithExpirationHandler: विधि और समाप्ति में कॉल कर रहा हूं। मैं एप्लिकेशन को endBackgroundTask पर कॉल कर रहा हूं। यहाँ दिया गया है:startBackgroundTaskWithExpirationHandler कॉलिंग एंडबैकग्राउंड टास्क लेकिन प्रक्रिया समाप्त नहीं कर रहा

__block UIBackgroundTaskIdentifier task = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
    [[UIApplication sharedApplication] endBackgroundTask:task]; 
    task = UIBackgroundTaskInvalid; 
}]; 
dispatch_queue_t queue = dispatch_queue_create("com.test.test1234", DISPATCH_QUEUE_SERIAL); 
dispatch_async(queue, ^{ 
    // My Task goes here 
}); 

कुछ मामलों में, मेरी धारावाहिक कतार जो प्रणाली द्वारा प्रदान की समय के भीतर पूरा नहीं किया जा सकता प्रदर्शन करने के लिए और अधिक काम किया है। तो समाप्ति ब्लॉक निष्पादित होगा और उसमें मैं UIBackgroundTaskIdentifier समाप्त कर रहा हूं लेकिन प्रेषण प्रक्रिया को रोक नहीं रहा हूं (मैं प्रेषण भी रद्द नहीं कर सकता)।

एप्पल के दस्तावेज़ का कहना है:

beginBackgroundTaskWithName को प्रत्येक कॉल: expirationHandler: या beginBackgroundTaskWithExpirationHandler: विधि इसी कार्य के साथ संबद्ध करने के लिए एक अद्वितीय टोकन उत्पन्न करता है। जब आपका ऐप कोई कार्य पूरा करता है, तो उसे एंडबैकग्राउंड टास्क को कॉल करना होगा: विधि को संबंधित टोकन के साथ विधि को यह बताने के लिए कि कार्य पूरा हो गया है। एंडबैकग्राउंड टास्क को कॉल करने में विफलता: पृष्ठभूमि कार्य के लिए विधि के परिणामस्वरूप आपके ऐप को समाप्त कर दिया जाएगा। यदि आपने कार्य शुरू करते समय एक समाप्ति हैंडलर प्रदान किया है, तो सिस्टम उस हैंडलर को कॉल करता है और आपको कार्य को समाप्त करने और समाप्ति से बचने का एक आखिरी मौका देता है।

तो, अगर मैं endBackgroundTask: पर कॉल नहीं करता हूं तो मेरा ऐप समाप्त हो जाएगा, जो ठीक है।

मेरा प्रश्न है: मेरे वर्तमान कार्यान्वयन के साथ यदि मैं endBackgroundTask: को समाप्ति में कॉल करता हूं हैंडलर ब्लॉक और मेरी प्रेषण कतार का कार्य पूरा नहीं होता है? मेरा ऐप समाप्त कर दिया जाएगा या निलंबित कर दिया जाएगा?

धन्यवाद

+0

यदि आपने एंडबैकग्राउंड टास्क कहा है: कहीं भी आपकी कतार। यह सिर्फ आपके आवेदन को निलंबित कर आवेदन को नींद में डाल दिया। –

+0

@ चिरागशाह तो यह मेरे ऐप को सही तरीके से मारने का कारण नहीं हो सकता है? वॉचडॉग केवल ऐप को मार देगा अगर मुझे 'एंडबैकग्राउंड टास्क' सही याद आती है? –

+0

हाँ मैं अपने आवेदन में वही सोचता हूं, यह उत्तर के लिए –

उत्तर

11

यहाँ कुछ परिदृश्य है, जो आप beginBackgroundTaskWithExpirationHandler अन्यथा अपने अनुप्रयोग terminate होगा का उपयोग करते समय संभाल करने की जरूरत है।

परिदृश्य 1: आपका ऐप Foreground में चल रहा है। आप beginBackgroundTaskWithExpirationHandler शुरू कर रहे हैं तो Background मोड में दर्ज करें। आपका ऐप लंबे समय तक जिंदा रहता है।

परिदृश्य 2: आपका ऐप Foreground में चल रहा है। आप beginBackgroundTaskWithExpirationHandler शुरू कर रहे हैं तो Background मोड में दर्ज करें। फिर Foreground मोड पर वापस आएं और आप endBackgroundTask पर कॉल नहीं कर रहे हैं तो आपका आवेदन अभी भी execute background queue है, इसलिए यह अगले 3 minute (आईओएस 7 से पहले आईओएस 7 परिचय के बाद) प्रक्रिया के लिए प्रक्रिया होगी, प्रक्रिया निष्पादन समय 10 मिनट था)। इसलिए आपको पृष्ठभूमि कतार को रद्द करना होगा और कार्य पृष्ठभूमि कतार से बाहर आना होगा और अग्रभूमि कतार में प्रवेश करना होगा।

तो यहां कोड दिखाए गए हैं। पृष्ठभूमि प्रक्रिया को संभालने का सबसे अच्छा तरीका क्या है।

चरण 1: वैश्विक चर के रूप में __block UIBackgroundTaskIdentifier bgTask घोषित करें।

चरण 2: एप्लिकेशन में निम्नलिखित कोड जोड़ने के लिए DidEnterBackground।

- (void)applicationDidEnterBackground:(UIApplication *)application { 

     bgTask = [application beginBackgroundTaskWithExpirationHandler:^{ 
     bgTask = UIBackgroundTaskInvalid; 
      }]; 

} 

चरण 3: रोक पृष्ठभूमि कार्य हैंडलर एक बार अग्रभूमि मोड में ऐप्स आते हैं।

- (void)applicationWillEnterForeground:(UIApplication *)application { 
    // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 

    [[UIApplication sharedApplication] endBackgroundTask:bgTask]; 

} 
+0

ठीक काम कर सकता है। परिदृश्य 2 में, यदि ऐप अग्रभूमि पर आता है तो मैं अंत बैकग्राउंड टास्क को कॉल नहीं करता हूं? मैं पहले ही समाप्ति ब्लॉक में एंडबैकग्राउंड टास्क को बुला रहा हूं। –

+0

कंपाइलर समझ जाएगा कि आपकी पृष्ठभूमि कतार अभी भी निष्पादित है, इसलिए उस कंपाइलर को आपके ऐप को समाप्त करने के बाद अगले 3 मिनट तक इसकी सीमा निष्पादन। यह परिदृश्य है जो मेरे साथ होता है। –

1

जिसे आपने समाप्ति हैंडलर में endBackgroundTask फोन नहीं है, तो अपने अनुप्रयोग समाप्त हो जाएगा।

एक बार जब आप अपने समाप्ति हैंडलर में endBackgroundTask पर कॉल करते हैं, तो आप केवल ओएस को बता रहे हैं "ठीक है, मैं महत्वपूर्ण कार्यों को सहेजने के साथ कर रहा हूं। यह अब आप पर निर्भर है।" इसके बाद आपके ऐप को थोड़ी देर के लिए निलंबित कर दिया जा सकता है और बाद में समाप्त कर दिया जा सकता है, या इसे सिस्टम संसाधनों के आधार पर तत्काल समाप्त कर दिया जा सकता है।

+0

या यह अन्य कार्यों की वजह से पृष्ठभूमि में रह सकता है ... – Honey

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