2012-11-26 23 views
7

पर पृष्ठभूमि दर्ज करने पर ऑपरेशन जारी रखें मेरे पास कुछ NSOperation है जो ऑनलाइन डेटाबेस से कुछ कोर डेटा तत्व अपडेट करते हैं, कभी-कभी अपडेट को कुछ मिनट की आवश्यकता होती है, और जब आईफोन लॉक की स्क्रीन होती है, तो ऐप में प्रवेश होता है पृष्ठभूमि मोड, और इस अद्यतन बंद कर दिया जाता है, तो मैं अद्यतन जारी रखने के लिए एप्लिकेशन को फिर से खोलने के लिए है, तो मैं ढेर अतिप्रवाह पर एक बहुत खोज की है और मैं के बारे में कुछ जानकारी मिल है:ऐप पर आईओएस

beginBackgroundTaskWithExpirationHandler 

से एक तरीका है कि ऐप्पल जो ऐप पृष्ठभूमि मोड में होता है, तब भी कुछ कार्य जारी रखने देता है, और मैंने यह किया है:

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

UIApplication *app = [UIApplication sharedApplication]; 
UIBackgroundTaskIdentifier bgTask; 

bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
    [app endBackgroundTask:bgTask]; 
}]; 
} 

और अब ऐप पृष्ठभूमि में कार्य जारी रखता है, और ऐसा लगता है कि सभी ठीक काम करते हैं, इसलिए मेरा सवाल यह है कि, मैं जिस विधि का उपयोग करता हूं वह सुरक्षित है? या एक बेहतर तरीका है?

धन्यवाद

+1

यहां पोस्ट किए गए उत्तर की जांच करें .. http://stackoverflow.com/questions/12071726/how-to-use-beginbackgroundtaskwithexpirationhandler-for-already-running-task-in – iDev

उत्तर

12

ऐसा नहीं है कि आप यह कैसे करते हैं। पृष्ठभूमि में चलाने के लिए आप जो भी कोड चलाने के लिए चाहते हैं उसे ठीक से लपेटा जाना चाहिए। कुछ इस तरह:

- (void)someMethodToKeepRunningInBackground { 
    UIBackgroundTaskIdentifier taskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void) { 
     // Uh-oh - we took too long. Stop task. 
    }]; 

    // Perform task here   

    if (taskId != UIBackgroundTaskInvalid) { 
     [[UIApplication sharedApplication] endBackgroundTask:taskId]; 
    } 
} 

आप UIApplicationDelegate applicationDidEnterBackground: विधि में कुछ भी नहीं करते।

"पृष्ठभूमि कार्य" कॉल के अंदर लिपटे गए किसी भी कार्य को ऐप पृष्ठभूमि में प्रवेश करते समय चलने की अनुमति दी जाएगी।

यहां वास्तव में महत्वपूर्ण हिस्सा है - कार्य केवल अधिकतम 10 मिनट हो जाता है। यदि यह अभी भी 10 मिनट के बाद चल रहा है तो आपका ऐप समाप्त कर दिया जाएगा। ऐप को अशुद्ध रूप से समाप्त होने से पहले समाप्ति हैंडलर आपको कार्य को साफ़ करने के लिए कुछ सेकंड देता है।

+0

हाँ, मैं वेब पर खोज कर रहा था मैंने सोचा समाधान यह था कि आपने अभी लिखा था, लेकिन मेरे प्रश्न में लिखा गया कोड काम करता है, मुझे नहीं पता कि कैसे, लेकिन अगर मैं अद्यतन शुरू करता हूं, तो मैं होम बटन दबाता हूं, जब मैं कुछ मिनट बाद अपडेट खोलता हूं सही ढंग से समाप्त हो गया है, आप इसे कैसे समझाते हैं? – Piero

+0

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

+0

ठीक है अब मैं धन्यवाद समझता हूं, इसलिए कोड के हर हिस्से में मैं चाहता हूं (आवश्यक रूप से डेंडरबैकग्राउंड विधि में नहीं) मैं आपके द्वारा समाधान में लिखने वाले कोड का उपयोग करता हूं, और मुझे उस कोड को लिखना है जिसे बैकग्राउंड मोड में भी पेफॉर्म करने की आवश्यकता है यहां // पेफरोम कार्य के बीच और यदि (taskId! = UIBackgroundTaskInvalid) .... सही? – Piero