अरे, मैं यहाँ हमारे ऐप के लिए मॉडल लेयर पर काम कर रहा हूँ।
कुछ आवश्यकताएँ इस प्रकार हैं:
- यह iPhone OS 3.0+ पर काम करना चाहिए।
- हमारे डेटा का स्रोत एक RESTful Rails एप्लिकेशन है।
- हमें कोर डेटा का उपयोग करके स्थानीय रूप से डेटा को कैश करना चाहिए।
- क्लाइंट कोड (हमारे UI नियंत्रक) को किसी भी नेटवर्क सामान के बारे में कम से कम ज्ञान होना चाहिए और कोर डेटा एपीआई के साथ मॉडल को क्वेरी / अपडेट करना चाहिए।
मैंने एक सर्वर-चालित उपयोगकर्ता अनुभव के निर्माण पर WWDC10 सत्र 117 की जाँच की है, कुछ समय वस्तुनिष्ठ संसाधन , कोर संसाधन , और RestfulCoreData चौखटे की जाँच में बिताया है ।
ऑब्जेक्टिव रिसोर्स फ्रेमवर्क अपने आप में कोर डेटा से बात नहीं करता है और यह केवल एक REST क्लाइंट कार्यान्वयन है। कोर संसाधन और RestfulCoreData आप अपने कोड में कोर डेटा से बात करते हैं और वे मॉडल परत पर पृष्ठभूमि में सभी नट और बोल्ट को हल।
सभी अब तक ठीक लग रहे हैं और शुरू में मैं या तो कोर रिसोर्स या रेस्टफुल कोरडाटा उपरोक्त सभी आवश्यकताओं को कवर करूंगा, लेकिन ... उनमें से कोई भी एक चीज नहीं है जो सही ढंग से हल करने के लिए प्रतीत होती है:
- सर्वर पर स्थानीय अपडेट सहेजते समय मुख्य थ्रेड को ब्लॉक नहीं किया जाना चाहिए।
- यदि बचत संचालन विफल हो जाता है तो त्रुटि को UI में प्रचारित किया जाना चाहिए और स्थानीय कोर डेटा स्टोरेज में कोई परिवर्तन नहीं किए जाने चाहिए।
जब आप - (BOOL)save:(NSError **)error
अपने प्रबंधित ऑब्जेक्ट संदर्भ पर कॉल करते हैं, तो कोर संसाधन सर्वर के लिए अपने सभी अनुरोधों को जारी करने के लिए होता है और इसलिए सर्वर को अंतर्निहित अनुरोधों का एक सही NSError उदाहरण प्रदान करने में सक्षम होता है जो किसी भी तरह से विफल हो जाता है। लेकिन यह कॉलिंग थ्रेड को तब तक ब्लॉक करता है जब तक कि सेव ऑपरेशन खत्म नहीं हो जाता। असफल।
RestfulCoreData आपके -save:
कॉल को बरकरार रखता है और क्लाइंट थ्रेड के लिए किसी अतिरिक्त प्रतीक्षा समय का परिचय नहीं देता है। यह केवल NSManagedObjectContextDidSaveNotification
नोटिफिकेशन हैंडलर में सर्वर के लिए संबंधित अनुरोधों को जारी करता है और फिर जारी करता है। लेकिन इस तरह से -save:
कॉल हमेशा सफलतापूर्वक पूरा और ग्राहक कोड (अच्छी तरह से, यह देखते हुए कोर डाटा सहेजे गए परिवर्तनों के साथ ठीक है) वास्तव में कहा जाता है कि यह कोई रास्ता नहीं में विफल रहा है हो सकता है क्योंकि कुछ बचाने के सर्वर से प्रचार करने के लिए पता करने के लिए है 404
या 421
या जो कुछ भी सर्वर-साइड त्रुटि हुई। और इससे भी अधिक, स्थानीय भंडारण डेटा को अद्यतन करने के लिए हो जाता है, लेकिन सर्वर कभी भी परिवर्तनों के बारे में नहीं जानता है। असफल।
इसलिए, मैं इन सभी समस्याओं से निपटने के लिए एक संभावित समाधान / सामान्य प्रथाओं की तलाश कर रहा हूं:
- मैं नहीं चाहता कि कॉलिंग थ्रेड प्रत्येक
-save:
कॉल पर ब्लॉक करें जबकि नेटवर्क अनुरोध होता है। - मैं यूआई में किसी तरह सूचनाएं प्राप्त करना चाहता हूं कि कुछ सिंक ऑपरेशन गलत हो गया।
- मैं चाहता हूं कि वास्तविक कोर डेटा सेव फेल होने के साथ ही सर्वर रिक्वेस्ट फेल हो जाए।
कोई विचार?