2011-02-02 11 views
54

मैंने कई आईओएस ऐप्स लिखे हैं जो बैकएंड के साथ संवाद कर रहे थे। लगभग हर बार, मैंने क्वेरी कैश करने के लिए HTTP कैश का उपयोग किया और प्रतिक्रिया डेटा (JSON) को उद्देश्य-सी ऑब्जेक्ट्स में पार्स किया। इस नई परियोजना के लिए, मुझे आश्चर्य है कि कोर डेटा दृष्टिकोण समझ में आता है या नहीं।किसी सर्वर से डेटा कैश करने के लिए क्लाइंट (आईओएस) पर कोर डेटा रणनीति

यहाँ मैं क्या सोचा है:

आईओएस क्लाइंट सर्वर को अनुरोध करता है और CoreData मॉडल के लिए JSON से वस्तुओं को पार्स।

प्रत्येक बार जब मुझे सीधे सर्वर लाने के बजाय एक नई वस्तु की आवश्यकता होती है, तो मैं यह देखने के लिए CoreData को पार्स करता हूं कि मैंने पहले ही यह अनुरोध किया है या नहीं। यदि वह ऑब्जेक्ट मौजूद है और समाप्त नहीं हुआ है, तो मैं प्राप्त ऑब्जेक्ट का उपयोग करता हूं।

हालांकि, यदि ऑब्जेक्ट मौजूद नहीं है या समाप्त हो गया है (कुछ कैशिंग तर्क यहां लागू होंगे), मैं ऑब्जेक्ट को सर्वर से लाऊंगा और तदनुसार कोरडाटा अपडेट करूंगा।

मैं इस तरह के एक वास्तुकला होने निम्नलिखित के साथ मदद कर सकता है लगता है: बैकएंड में 1. से बचें अनावश्यक प्रश्नों 2. ऑफ़लाइन ब्राउज़िंग के लिए एक पूर्ण समर्थन की अनुमति दें (आप अभी भी DataCore के आरडीबीएमएस के साथ संबंधित प्रश्नों कर सकते हैं)

अब एसओ गॉड्स के लिए मेरा प्रश्न है:

  1. मुझे पता है कि इस तरह के बैकएंड तर्क को दूसरी बार (सर्वर + कोरडाटा) कोड करने की आवश्यकता है, लेकिन यह ओवरकिल है?
  2. मेरे द्वारा अनुमानित किसी भी सीमा का अनुमान लगाया गया है?
  3. कोई अन्य विचार?

उत्तर

90

सबसे पहले, यदि आप एक पंजीकृत आईओएस देव हैं, तो आपको डब्ल्यूडब्ल्यूडीसी 2010 सत्रों तक पहुंच प्राप्त करनी चाहिए। उन सत्रों में से एक जो आप इस बारे में बात कर रहे हैं, उनमें से एक है: "सत्र 117, सर्वर संचालित उपयोगकर्ता अनुभव बनाना"। आपको find it on iTunes पर सक्षम होना चाहिए।

आरईएसटी/जेएसओएन/कोर डेटा का एक स्मार्ट संयोजन एक आकर्षण की तरह काम करता है और यदि आप अपने कोड का पुन: उपयोग करने की योजना बनाते हैं तो एक बड़ा समय बचाने वाला है, लेकिन HTTP के बारे में ज्ञान की आवश्यकता होगी (और कोर डेटा के बारे में ज्ञान, यदि आप चाहते हैं ऐप्स को अच्छी तरह से और सुरक्षित करने के लिए)।

तो कुंजी आरईएसटी और कोर डेटा को समझना है।

  • समझना REST का मतलब समझना HTTP तरीके (मिलता है, पोस्ट, PUT,, हटाएँ ... HEAD?) और उत्तर-कोड (2xx, 3xx, 4xx, 5xx) और हेडर (Last-Modified, इफ- संशोधित-चूंकि, Etag, ...)

  • कोर डेटा को समझना मतलब है कि कैसे अपने मॉडल को डिजाइन करना, संबंध स्थापित करना, समय लेने वाली परिचालनों को संभालना, हटाना, आवेषण, अपडेट), और चीजों को कैसे करना है पृष्ठभूमि इसलिए आपका यूआई उत्तरदायी रहता है। और निश्चित रूप से एसक्लाइट पर स्थानीय रूप से पूछताछ कैसे करें (उदाहरण के लिए आईडी को प्रीफ़ेट करने के लिए ताकि आप अपने सर्वर-साइड समकक्ष प्राप्त करने के बाद नए बनाने के बजाय ऑब्जेक्ट्स अपडेट कर सकें)।

आप कार्यों आप का उल्लेख के लिए एक पुन: प्रयोज्य एपीआई को लागू करने की योजना है, तो आप आप आराम और कोर डाटा को समझते हैं, क्योंकि है कि जहां सबसे कोडिंग शायद करना होगा है यह सुनिश्चित करना चाहिये। (मौजूदा एपीआई - ASIHttpRequest नेटवर्क परत (या किसी अन्य) के लिए और किसी भी अच्छे JSON lib (उदाहरण के लिए SBJSON) पार्सिंग के लिए काम करेगा।

कुंजी इस तरह के एक एपीआई सरल बनाने के लिए अपने सर्वर एक RESTful सेवा प्रदान करने के लिए है, और अपने संस्थाओं आवश्यक विशेषताएं (DateCreated, dateLastModified, आदि) तो आप अनुरोध (आसानी से ASIHttpRequest के साथ किया बना सकते हैं पकड़े हुए, वे हो प्राप्त करें, दबाएं, पोस्ट करें, हटाएं) और उपयुक्त एचटीपी-हेडर जोड़ें, उदाहरण के लिए एक सशर्त प्राप्त करने के लिए: अगर संशोधित-के बाद से।

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

यदि आपका प्राथमिक लक्ष्य किसी सर्वर-साइड समकक्ष से कोर-डेटा इकाई को फिर से अपडेट करने से बचाना है, तो सुनिश्चित करें कि आपके पास अपनी इकाई में "अंतिम-संशोधित" विशेषता है, और एक सशर्त जीईटी करें सर्वर ("अगर-संशोधित-चूंकि" आपकी इकाइयों के लिए "अगर-संशोधित-चूंकि" एचटीपी-हेडर सेट करना "अंतिम-संशोधित" दिनांक। सर्वर उस स्थिति को परिवर्तित नहीं करता है, तो सर्वर स्थिति-कोड 304 (संशोधित नहीं) के साथ प्रतिक्रिया देगा (मान लेना कि सर्वर है REST-ful)। यदि यह बदल गया है, तो सर्वर अंतिम परिवर्तन किए जाने की तारीख तक "अंतिम-संशोधित" एचटीपी-हेडर सेट करेगा, स्थिति-कोड 200 के साथ प्रतिक्रिया देगा और शरीर में संसाधन वितरित करेगा (उदाहरण के लिए JSON में प्रारूप)

तो, हमेशा के रूप में, आपके प्रश्न का उत्तर हमेशा के रूप में 'यह निर्भर करता है'। यह अधिकतर निर्भर करता है कि आप क्या करेंगे आपके पुन: प्रयोज्य करने के लिए यह सभी कोर-डेटा/आराम परत डालने के लिए।

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

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

लम्बे प्रतिक्रिया के लिए खेद है, मुझे लगा कि आप एक सामान्य एपीआई या यहां तक ​​कि ढांचे के निर्माण की तरह कुछ कदम उठा रहे थे। उन चीजों में समय, ज्ञान, हाउसकीपिंग और दीर्घकालिक प्रतिबद्धता होती है, और अधिकांश समय, वे समय बर्बाद कर देते हैं, क्योंकि आप उन्हें कभी खत्म नहीं करते हैं।

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

यदि आपके पास सर्वर-साइड सेवा को संशोधित करने की लक्जरी है (तो एकदम सही तरीके से), तो आप ठीक हैं, बशर्ते आप इसे अच्छी तरह कार्यान्वित करें (अनुभव से, आप जितना 3/4 बचा सकते हैं नेटवर्क/पार्सिंग कोड आईओएस-साइड अगर सेवा अच्छी तरह से व्यवहार करती है (उपयुक्त HTTP स्टेटस कोड देता है, शून्य के लिए चेक से बचाता है, तारों से संख्या परिवर्तन, तिथियां, अंतर्निहित तारों के बजाय लुकअप-आईडी प्रदान करता है ...)

यदि आपके पास वह लक्जरी नहीं है, फिर या तो वह सेवा कम से कम REST-ful है (जो बहुत मदद करता है), या आपको चीजों को क्लाइंट-साइड (अक्सर दर्द होता है) को ठीक करना होगा।

+1

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

+0

हमेशा की तरह, उत्तर शायद 'यह निर्भर करता है'। – codeclash

+0

मैं अपना उत्तर संपादित करूंगा, टिप्पणी बॉक्स उन कई वर्णों की अनुमति नहीं देता है :-) – codeclash

5

वहां वहाँ एक समाधान है कि मैं कोशिश नहीं कर सका क्योंकि मैं भी हूं अपने प्रोजेक्ट लेकिन मेरे ऐप्लिकेशन के सर्वर कैशिंग पहलू refactor करने में अब तक यह वहाँ बाहर है कि अभी भी एक जवाब के लिए देख रहे लोगों के लिए उपयोगी होना चाहिए:

http://restkit.org/

यह करता है मैं वास्तव में क्या किया था, लेकिन यह भी बहुत कुछ पृथक है मैंने जो किया वहाँ बहुत अंतर्दृष्टि सामान। मुझे आशा है कि यह किसी की मदद करेगा!

+5

रिकॉर्ड के लिए: github पर एक और नया एपीआई बाहर है: https: //github.com/gowalla/AFNetworking। यह कोर डेटा दृढ़ता प्रदान नहीं करता है (जो RestKit करता है), लेकिन यह रीस्टफुल सेवाओं के साथ बातचीत के लिए एक बहुत अच्छा और थइट ब्लॉक-आधारित एपीआई है। इसमें जेएसओएन-पार्सिंग के लिए भी अंतर्निहित समर्थन है (आईओएस के लिए तेज़ JSONKit <5 और आईओएस 5 के साथ शुरू होने वाले ऐप्पल का अपना नया JSON serializer 5. अगर आप आसान एसिंक नेटवर्किंग चाहते हैं लेकिन अभी भी कोर डेटा दृढ़ता पर पूर्ण नियंत्रण है तो यह बहुत ही लगता है स्वच्छ समाधान – codeclash

+6

RestKit अपने नेटवर्क परत के लिए AFNetworking का उपयोग करता है –

5

मुझे लगता है कि यह एक वैध दृष्टिकोण है। मैंने इसे कई बार किया है। मुश्किल हिस्सा तब होता है जब आपको सिंक्रनाइज़ करने से निपटने की आवश्यकता होती है: यदि क्लाइंट और सर्वर दोनों एक ही समय में चीजें बदल सकते हैं। इसके लिए आपको लगभग हमेशा ऐप-विशिष्ट विलय तर्क की आवश्यकता होती है।

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