2015-05-15 9 views
6

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

UIApplication *app = [UIApplication sharedApplication]; 

//create new uiBackgroundTask 
__block UIBackgroundTaskIdentifier bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
    [app endBackgroundTask:bgTask]; 
    bgTask = UIBackgroundTaskInvalid; 
}]; 

//and create new timer with async call: 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    //run function methodRunAfterBackground 
    NSString *server = [variableStore sharedGlobalData].server; 
    NSLog(@"%@",server); 
    if([server isEqual:@"_DEV"]){ 
     arrivalsTimer = [NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(getArrivals) userInfo:nil repeats:YES]; 
    } 
    else { 
     arrivalsTimer = [NSTimer scheduledTimerWithTimeInterval:300 target:self selector:@selector(getArrivals) userInfo:nil repeats:YES]; 
    } 
    [[NSRunLoop currentRunLoop] addTimer:arrivalsTimer forMode:NSDefaultRunLoopMode]; 
    [[NSRunLoop currentRunLoop] run]; 
}); 

यह बिल्कुल ठीक काम करता है में applicationDidEnterBackground विधि में निम्नलिखित कोड का उपयोग कर रहा है, जब तक उपकरण को स्वत: ताले और फिर घड़ी की टिक टिक बंद हो जाता है। ऐसा होने से रोकने के बारे में कोई सुझाव? डिफ़ॉल्ट लाइव टाइम 5 मिनट है, इसलिए अधिकांश डिवाइसों को एक बार भी टिकने से पहले लॉक कर दिया जाएगा।

धन्यवाद

+0

शायद तुम अगर आप समय से बाहर करें या समस्या कहीं और है चला रहे हैं देखने के लिए हैंडलर में कुछ मुद्रित कर सकते हैं। – Andreas

+0

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

+0

मेरा मतलब है कि समाप्ति हैंडलर में कुछ प्रिंट करें। यदि यह आपको केवल अतिरिक्त निष्पादन समय देता है, जब स्क्रीन सामान्य रूप से ऑटो-लॉक हो जाती है तो आपको एनएसएलओजी के साथ मिल जाएगा। – Andreas

उत्तर

2

टिप्पणियों के एक जोड़े:

  1. के रूप में श्री एच बताते हैं, beginBackgroundTaskWithExpirationHandler केवल आप समकालीन iOS संस्करण में तीन मिनट (180 सेकंड) देता है। तो पांच मिनट में टाइमर आग लगाने का प्रयास काम नहीं करेगा।

    आप [[UIApplication sharedApplication] backgroundTimeRemaining] का उपयोग करके पूछ सकते हैं कि आपने कितना समय छोड़ा है।

  2. डिवाइस लॉक होने पर, पृष्ठभूमि कार्य जारी रहता है। आपको ऐप को समाप्त नहीं करना चाहिए। यदि उपयोगकर्ता मैन्युअल रूप से "होम बटन को दो बार टैप करें और टास्क स्विचर स्क्रीन पर स्वाइप करें" के माध्यम से ऐप को मैन्युअल रूप से समाप्त कर देता है, जो पृष्ठभूमि कार्यों को मार देगा, लेकिन डिवाइस को लॉक नहीं करेगा।

  3. टाइमर पर कुछ टिप्पणियां:

    • कोड पृष्ठभूमि कतार में टाइमर जोड़ रहा है। यह आमतौर पर आवश्यक नहीं है। सिर्फ इसलिए कि ऐप पृष्ठभूमि स्थिति में है, फिर भी आप टाइमर और इसी तरह के लिए मुख्य रन लूप का उपयोग करना जारी रख सकते हैं।

      तो, मुख्य धागे से scheduledTimerWithTimeInterval पर कॉल करें और आप कर चुके हैं। एक रन लूप के साथ एक जीसीडी वर्कर थ्रेड का उपयोग करने में कोई बात नहीं है जब तक कि बिल्कुल जरूरी नहीं है (और फिर भी, मैं अपना खुद का धागा बना सकता हूं और उस पर एक रन लूप जोड़ सकता हूं)।

      वैसे, अगर कुछ पृष्ठभूमि प्रेषण कतार पर टाइमर शेड्यूल करना बिल्कुल जरूरी है, तो इसके बजाय प्रेषण टाइमर का उपयोग करना शायद आसान है। यह पूरी तरह से रन लूप आवश्यकता को समाप्त करता है।

    • बीटीडब्ल्यू, addTimer के साथ उपयोग करना उचित नहीं है। टाइमर बनाने और इसे वर्तमान रन लूप में जोड़ने के लिए आप scheduledTimerWithTimeInterval पर कॉल करें। आप timerWithTimeInterval का उपयोग करते हैं और फिर addTimer पर कॉल करें यदि आप इसे किसी अन्य रन लूप में जोड़ना चाहते हैं।

+0

फिर से पोस्ट करने के लिए खेद है। कोड को हटाने के बाद और टाइमर कोड चलाने के बाद टाइमर या तो शुरू नहीं होता है, या जब यह शुरू होता है, जब मैं ऐप को फिर से सामने लाता हूं, तो यह एक जमे हुए राज्य में होता है (मुझे लगता है क्योंकि टाइमर अभी भी उठा रहा है सूत्र)। किसी भी तरह से शुरुआती कोड एकमात्र तरीका है जिसे मैं वांछित प्रभाव प्राप्त कर सकता हूं। ऐसा लगता है कि एक्सकोड लर्निंग वक्र पहले सोचा था जितना तेज है। ओह ठीक है, किसी भी मामले में आपके उत्तरों के लिए धन्यवाद। –

+0

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

+0

आह हे! टाइमर फायरिंग नहीं कर रहे थे क्योंकि मैं निर्धारित टाइमर विथटाइम इंटरवल के बजाय टाइमर विथटाइम इंटरवलल सेट करता था, इसे बदल दिया और यह पूरी तरह से काम करता है और आगे लौटने पर फ्रीज नहीं होता है। आपकी सभी मदद रोब के लिए धन्यवाद! –

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