2012-05-24 9 views
14

मैं parse.com एपीआई (होस्टेड बैकएंड का उपयोग करके एक ऐप विकसित कर रहा हूं जो अपने सर्वर पर डेटा सहेजने के लिए एपीआई प्रदान करता है)। मैं ऐप को निर्बाध रूप से ऑनलाइन और ऑफ़लाइन उपयोग करने में सक्षम होना चाहता हूं। इसके लिए मुझे एक कतार का उपयोग करने की आवश्यकता होगी जहां मैं उन ब्लॉक को रख सकता हूं जिनके लिए नेटवर्क पहुंच की आवश्यकता होती है। जब नेटवर्क उपलब्ध हो जाता है, तो ब्लॉक को क्रमशः निष्पादित किया जाना चाहिए और जब नेटवर्क ऑफलाइन हो जाता है, तो कतार प्रसंस्करण को निलंबित किया जाना चाहिए।आईओएस: पृष्ठभूमि में कतार ब्लॉक और नेटवर्क उपलब्ध होने पर निष्पादित करें

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

उत्तर

15

मैं वही करता हूं जो आप NSOperationQueue का उपयोग करने के लिए लक्षित कर रहे हैं। सबसे पहले, एक सीरियल कतार बना सकते हैं और डिफ़ॉल्ट रूप से यह निलंबित: फिर

self.operationQueue = [[[NSOperationQueue alloc] init] autorelease]; 
self.operationQueue.maxConcurrentOperationCount = 1; 
[self.operationQueue setSuspended:YES]; 

, एक गम्यता उदाहरण बना सकते हैं और kReachabilityChangedNotification के लिए रजिस्टर:, अब

[[NSNotificationCenter defaultCenter] addObserver:manager 
             selector:@selector(handleNetworkChange:) 
              name:kReachabilityChangedNotification 
              object:nil]; 

[self setReachability:[Reachability reachabilityWithHostName:@"your.host.com"]]; 
[self.reachability startNotifier]; 

शुरू करने और अपने कतार रोक जब नेटवर्क स्थिति परिवर्तन :

:

-(void)handleNetworkChange:(NSNotification *)sender { 
    NetworkStatus remoteHostStatus = [self.reachability currentReachabilityStatus]; 

    if (remoteHostStatus == NotReachable) { 
     [self.operationQueue setSuspended:YES]; 
    } 
    else { 
     [self.operationQueue setSuspended:NO]; 
    } 
} 

आप के साथ अपने ब्लॉक कतार कर सकते हैं

कतार को निलंबित करने से केवल संचालन को रोकने से रोका जाएगा - यह प्रगति पर एक ऑपरेशन को निलंबित नहीं करेगा। एक ऑपरेशन निष्पादित करते समय आप नेटवर्क खो सकते हैं, इसलिए आपको अपने ऑपरेशन में इसके लिए जिम्मेदार होना चाहिए।

+0

मैं इस तरह के दृष्टिकोण की कोशिश कर रहा हूं लेकिन कनेक्टिविटी रिटर्न मिलने पर मुझे "आउट-ऑफ-स्कोप डेलोक्ड" ब्लॉक के साथ परेशानी हो रही है .. क्या आपको कुछ समय बाद अपने ब्लॉक का आह्वान करने में कोई समस्या है? ऐसा लगता है: "वर्तमान फ्रेम को पुनर्स्थापित नहीं कर सका" –

1

क्या आपने AFNetworking लाइब्रेरी का उपयोग करने पर देखा है? मेरा मानना ​​है कि इसमें रीचबिल्टिया में हुक है और आप वैसे ही व्यवहार कर सकते हैं जैसा आप चाहते हैं।

+0

धन्यवाद। मैंने AFNetworking lib को देखा था, लेकिन यह NSURL अनुरोधों के लिए और अधिक नहीं है और कोई भी मनमानी ब्लॉक नहीं है जिसे मैं केवल तभी निष्पादित करना चाहता हूं जब इंटरनेट उपलब्ध हो (जो केवल ब्लॉक निष्पादन के कुछ हिस्सों के लिए नेट कनेक्शन का उपयोग कर सकता है)। – Devang

+0

मैं देखता हूं कि आपका क्या मतलब है ... पहुंच योग्यता का जवाब मेरा अगला विचार होगा, बीटीयू मुझे लगता है कि किसी ने पहले से ही उस विचार को दूर कर दिया है। –

0

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

2

-[PFObject saveEventually] देखें। ऐसा करना चाहिए जो आप स्वचालित रूप से करने का प्रयास कर रहे हैं और ऐप समाप्ति के खिलाफ लचीला होने का अतिरिक्त लाभ है।

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