2009-07-17 9 views
8

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

पहली बात यह है कि अगर मुझे कहना है कि हाल की तस्वीरों की एक सूची है, तो मुझे उन्हें बाहरी डेटा स्रोत से पकड़ना होगा। सूची को पुनर्प्राप्त करने के बाद, ऐसा लगता है कि मुझे प्रत्येक फोटो के लिए पुन: सक्रिय करना और प्रबंधित ऑब्जेक्ट बनाना चाहिए। इस बिंदु पर, मैं अपने कोड में जारी रख सकता हूं और एक मानक अनुरोध डेटा सेट अप करने के लिए मानक कोर डेटा एपीआई का उपयोग कर सकता हूं और कह सकता हूं, कुत्तों के बारे में फ़ोटो का सबसेट पुनर्प्राप्त कर सकता हूं।

लेकिन क्या मैं तो जारी रखने के लिए और उपयोगकर्ता की फ़ोटो की सूची प्राप्त करना चाहते हैं? चूंकि यह संभावना है कि इन दो डेटा सेटों का अंतर हो सकता है, क्या मुझे मौजूदा डेटा पर एक फ़ेच अनुरोध करना है, पहले से मौजूद अपडेट अपडेट करें, और फिर नई ऑब्जेक्ट्स डालें?

-

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

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

मैं जिस तरह से बंद यहाँ आधार हूँ? क्या रिमोट डेटा और कोर डेटा से निपटने के लिए लोग कोई पैटर्न चुनते हैं? :) मुझे लोगों के कुछ पद मिलते हैं कि उन्होंने यह किया है, और यह उनके लिए काम करता है, लेकिन उदाहरणों के तरीके में थोड़ा सा है। धन्यवाद।

+0

क्या आप जो चाहते हैं उसके बारे में अधिक विशिष्ट हो सकते हैं? 'बाहरी डेटासोर्स का उपयोग करता है' बहुत अस्पष्ट है। ऐसा लगता है जैसे आप स्थानीय डेटाबेस के एक टुकड़े को स्थानीय रूप से मिरर करना चाहते हैं। क्या आपको स्थानीय परिवर्तन करने की ज़रूरत है जो वापस प्रचारित हो जाएं? संघर्ष के बारे में क्या? यह एक कठिन समस्या है और अधिक जानकारी निर्देशों का सुझाव देने में मदद करेगी। –

+0

शायद एक पुराना धागा, मैं चीजों को पृष्ठभूमि धागे में लाने की कोशिश करने के लिए लुभाना चाहता हूं और उन्हें लगातार स्टोर में लिखना चाहता हूं और अधिसूचनाएं वहां से मुख्य धागे तक चली जाती हैं - सुनिश्चित नहीं है कि यह काम करेगा, लेकिन अच्छा होगा अगर यह – bshirley

उत्तर

0

यह आप सत्र के बीच डिस्क के लिए तस्वीर वस्तुओं (और एक सूचकांक) को बचाने के लिए कोको के संग्रह करने की सुविधा का उपयोग कर सकता है, और सिर्फ यह सब हर बार एप्लिकेशन फ़्लिकर को घर कहते हैं ऊपर लिख तरह एक स्थिति के लिए।

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

हटाने को संभालने के लिए, हर बार रीफ्रेश किए जाने पर डेटा स्टोर को साफ़ करने का सबसे आसान तरीका होगा। अन्यथा आपको सबकुछ पर पुन: प्रयास करना होगा और केवल उन फाइलनामों के साथ फोटो ऑब्जेक्ट्स को हटाना होगा जो नए परिणामों में शामिल नहीं थे।

मैं अपने आप को इस के समान कुछ करने के लिए योजना बना रहा हूँ तो मुझे आशा है कि इस मदद करता है।

पीएस: यदि आप सत्रों के बीच फोटो ऑब्जेक्ट्स को संग्रहीत नहीं कर रहे हैं, तो आप केवल दो अलग-अलग संदर्भों का उपयोग कर सकते हैं और उन्हें अलग से पूछ सकते हैं। जब तक वे कभी भी सहेजे नहीं जाते हैं, और केंद्रीय स्टोर में पहले से कुछ भी नहीं है, यह आपके जैसा वर्णन करने जैसा ही काम करेगा।

2

मुझे ऐसा लगता है कि आपकी पहली सहज ज्ञान सही हैं: आप अपने मौजूदा दुकान अद्यतन करने के लिए fetchrequests उपयोग करना चाहिए। एक आयातक के लिए उपयोग किया जाने वाला दृष्टिकोण निम्न था: उन सभी फ़ाइलों की एक सूची प्राप्त करें जो इसे आयात करने और स्टोर करने के योग्य हैं। मैं यहां मान रहा हूं कि वह सूची तेज़ और हल्का है (केवल एक नाम और एक यूआरएल या अद्वितीय आईडी), लेकिन वास्तव में कुछ आयात करने में थोड़ा और समय लगेगा और उपयोगकर्ता प्रोग्राम छोड़ सकता है या कुछ करना चाहता है अन्य सभी आयात करने से पहले।

फिर, एक अलग पृष्ठभूमि धागे पर (यह उतना कठिन नहीं है जितना कि यह NSRunLoop और NSTimer के लिए धन्यवाद लगता है, "कोर डेटा: कुशलतापूर्वक आयात डेटा" पर Google), उस सूची का पहला आइटम प्राप्त करें, ऑब्जेक्ट प्राप्त करें फ़्लिकर या कहीं भी और कोर डेटा डेटाबेस में इसकी खोज करें (कुशल, कैश किए गए NSFetchRequests की स्थापना पर एप्पल की भविष्यवाणी प्रोग्रामिंग मार्गदर्शिका को ध्यान से पढ़ें)। यदि रिमोट ऑब्जेक्ट कोर डेटा में पहले से ही रहता है, तो सम्मिलित न होने पर जानकारी को आवश्यकतानुसार अपडेट करें। जब यह किया जाता है, तो आइटम को आयातित सूची से हटा दें और अगले पर जाएं। समय-समय पर सिंक्रनाइज़ या आलसी, मांग पर सिंक्रनाइज़:

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

2

आप दो चीजों का एक संयोजन की कोशिश कर सकते। यह रणनीति आपको एक इंटरफेस देगा जहां आपको एनएसएफएटीएचआरक्वेट के परिणाम दो बार मिलेंगे: एक बार सिंक्रनाइज़ हो जाएंगे, और एक बार फिर जब नेटवर्क से डेटा लोड किया गया हो।

  1. NSFetchRequest कि जब लाने समाप्त हो गया है के लिए एक अतिरिक्त ब्लॉक संपत्ति पर अमल लेता है की अपनी खुद की उपवर्ग बनाएँ। यह आपके एसिंक्रोनस नेटवर्क के लिए अनुरोध के लिए है। आइए पर कॉल करें FLRFetchRequest

  2. इस श्रेणी को पास करने के लिए एक कक्षा बनाएं। आइए इसे FLRPhotoManager पर कॉल करें। FLRPhotoManager एक विधि executeFetchRequest: जो FLRFetchRequest और के उदाहरण लेता है ...

    1. कतार अपने नेटवर्क अनुरोध लाने अनुरोध के आधार पर और बनाए रखा लाने का अनुरोध साथ गुजरता फिर से संसाधित करने के लिए जब नेटवर्क अनुरोध है ख़त्म होना।
    2. आपके कोरडाटा कैश के खिलाफ fetch अनुरोध निष्पादित करता है और तुरंत परिणाम देता है।
    3. अब जब नेटवर्क अनुरोध पूर्ण होने पर, नेटवर्क डेटा के साथ अपने मूल डेटा कैश अद्यतन करते हैं, कैश के खिलाफ फिर से अनुरोध लाने चलाने के लिए, और इस बार, FLRFetchRequest से ब्लॉक खींच सकते हैं और इस के परिणामों से पारित ब्लॉक में अनुरोध लाने , दूसरे चरण को पूरा करना।

यह सबसे अच्छा पैटर्न मैं के साथ आए हैं, लेकिन आप की तरह, मैं दूसरों की राय में दिलचस्पी रखता हूँ।

+0

करता है तो मैं भी एक समान दृष्टिकोण के साथ आया हूं - मुझे आश्चर्य है कि क्या आपको अब तक ऐसा करने का बेहतर तरीका मिला है? – Petar

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