2010-08-12 13 views
6

मेरे पास मूल डेटा (जो मैं नया हूं) के बारे में कुछ बुनियादी प्रश्न हैं और मैं वर्तमान मानकों और कार्यान्वयन पर कुछ बिंदुओं को देखना चाहता हूं।सामान्य उपयोग के आसपास कोर डेटा प्रश्न

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

मैं सिर्फ पहले कुछ बातें जानना चाहता था:

  1. लोग इन दिनों प्रबंधित वस्तुओं है कि डोमेन वस्तुओं के रूप में NSManagedObject का विस्तार, या आप भंडारण के लिए सख्ती से अलग वर्गों बना सकते हैं और करने के लिए सहायक तरीकों बना सकता हूँ का इलाज करते हैं उन्हें डोमेन ऑब्जेक्ट्स में बनाएं? कभी-कभी मुझे अच्छी चीज होने के लिए डोमेन से सभी दृढ़ता तर्क को दूर रखना पड़ता है।

  2. साफ करने के बारे में क्या? जब ऐप बंद हो जाता है, या शायद स्थानीय संग्रहण में डेटा समाप्त हो जाता है तो कोई आम तौर पर सभी डेटा को कैसे हटाता है? मैं निश्चित रूप से उपयोगकर्ता फोन पर डेटा हमेशा पकड़ना नहीं चाहता हूं।

  3. क्या कोर डेटा के साथ कोई प्रकार की परमाणुता है? मेरा कार्यान्वयन पहले वेब सेवाओं को मारने से पहले स्थानीय रूप से डेटा की जांच करेगा, मैं यह सुनिश्चित करना चाहता हूं कि स्थानीय स्टोरेज में आधा डेटासेट नहीं किया जा रहा है और मजेदार परिणाम प्राप्त करें।

  4. मैं पृष्ठभूमि में डेटा प्राप्त करने का एक उचित कुछ पृष्ठभूमि धागे को चलाने के लिए चाहते हैं, वहाँ किसी भी बातें मैं जब एक पृष्ठभूमि धागे पर वस्तुओं बने पर विचार करने की आवश्यकता होगी रहे हैं?

  5. उपर्युक्त प्रश्न के संबंध में, "पृष्ठभूमि लाने" लूप बनाने का सबसे अच्छा तरीका क्या है? ऐप प्रतिनिधि में? दृश्य के आधार पर प्रति दृश्य? आदि...?

मुझे आशा है कि इन भी बुनियादी नहीं हैं :)

किसी भी मदद आप दे सकते हैं के लिए धन्यवाद।

उत्तर

5

करो लोग इन दिनों में कामयाब वस्तुओं कि डोमेन वस्तुओं के रूप में NSManagedObject का विस्तार, या आप सख्ती से भंडारण के लिए अलग वर्गों बना सकता हूँ और डोमेन वस्तुओं में उन्हें बनाने के लिए सहायक तरीकों बनाने का इलाज? मैं कभी-कभी डोमेन से अच्छी स्थिति होने के लिए सभी दृढ़ता तर्क को ढूंढता हूं।

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

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

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

मैं इस पर एक स्पष्ट वरीयता अभी तक नहीं है, लेकिन दोहराव की कमी की वजह से, प्रबंधित वस्तुओं सीधे उपयोग करने के लिए दुबला। आप परिवर्तनों को सुनकर या कोर डेटा नियंत्रक वर्ग का उपयोग करके खराब दुष्प्रभावों को कम कर सकते हैं।

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

http://rentzsch.github.com/mogenerator/

क्या साफ अप के बारे में? कैसे एक आम तौर पर सभी डेटा जब एप्लिकेशन बंद कर देता है को नष्ट करता है, या शायद, स्थानीय भंडारण में डेटा की समय सीमा समाप्त? मैं निश्चित रूप से हर समय उन फोन पर डेटा रखने के लिए नहीं चाहते।

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

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

परमाणुता आती है कि आप एक संदर्भ में संचालन करते हैं और फिर संदर्भ को सहेजने के लिए कहते हैं। तो सच atomicity एक को बचाने से पहले आप तैयार है, जो आम तौर पर अपने स्वयं के संदर्भ में कुछ कर रही है और एक मास्टर संदर्भ में वापस विलय का मतलब कर रहे हैं जारी करने के अन्य घटकों से बचने का मतलब है।

मैं पृष्ठभूमि में डेटा प्राप्त करने का एक उचित कुछ पृष्ठभूमि धागे को चलाने के लिए चाहते हैं, वहाँ किसी भी चीजें मैं जब एक पृष्ठभूमि धागे पर वस्तुओं बने पर विचार करने की आवश्यकता होगी रहे हैं?

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

आपको डुप्लिकेट अनुरोधों से बचने के लिए मजबूती से प्रयास करना चाहिए जो एक ही समय में एक ही ऑब्जेक्ट को सहेज सकता है, यह कभी-कभी मर्ज पर कोर डेटा त्रुटियों का कारण बन सकता है।इससे संबंधित - अपने मुख्य संदर्भ पर विलय नीति सेट करें क्योंकि डिफ़ॉल्ट नीति अपवाद फेंकना है।

इसका मतलब यह भी है कि मॉडलिंग करने में, कई अलग-अलग ऑब्जेक्ट्स के लिए जाएं, संभवतः आप एक बड़ी वस्तु के बजाय कई अलग-अलग स्रोतों से डेटा एकत्र कर सकते हैं।

बचत और अन्य संदर्भों में मर्ज किए जाने के बारे में अधिक जानकारी के लिए, इस सवाल देखें:

CoreData and mergeChangesFromContextDidSaveNotification

ऊपर सवाल है, के संबंध में क्या प्राप्त करते समय एक "पृष्ठभूमि बनाने के लिए सबसे अच्छा तरीका है "लूप? ऐप प्रतिनिधि में? दृश्य के आधार पर प्रति दृश्य? आदि...?

मैं एक अलग सिंगलटन वर्ग से यह करना चाहते (सभी के बाद, AppDelegate अपने आप में एक सिंगलटन है ...), कि मैं एक संदर्भ एक धागा करने के लिए विशिष्ट के अतिरिक्त मुख्य प्रबंधित वस्तु संदर्भ के लिए पूछ सकते ।

यह भी उपयोगी है कि एक नया कोर डेटा प्रोजेक्ट शुरू करते समय, आपको कोर डेटा टेम्पलेट का उपयोग करने की आवश्यकता नहीं है और केवल इस कोर डेटा मैनेजर का पुनः उपयोग कर सकते हैं।

+0

सबसे पहले, आपके उत्तर के लिए समय निकालने के लिए धन्यवाद, विवरण के लिए +1। मेरे पास कुछ अनुवर्ती प्रश्न हैं, 1. क्या आप परमाणुता के बारे में कुछ और बता सकते हैं? मैंने अभी उस पर वास्तव में आपका पालन नहीं किया था। 2. आप एक मास्टर संदर्भ का उल्लेख करते हैं, और विलय करते हैं, मैं इनसे परिचित नहीं हूं, क्या आप शायद इन पर विस्तार भी कर सकते हैं? 3. आप प्रति थ्रेड के विभिन्न संदर्भों का प्रबंधन कैसे करते हैं? क्या यह सिर्फ धागे के निर्माण पर एक संदर्भ प्राप्त करने का मामला है, फिर एक बार धागा मुख्य धागे और विलय के संदर्भ में 'लौट रहा है'? – Mark

+0

1) आप प्रबंधित वस्तुओं पर आवश्यक संचालन करते हैं - जब तक आप संदर्भ को सहेज नहीं लेते तब तक कोई भी "छड़ी" नहीं बदलता है। संदर्भ से छुटकारा पाएं (या परिवर्तनों को वापस लेना) रोलबैक की तरह है। 2-3 के लिए - विचार यह है कि आपके पास मुख्य धागे के लिए एक संदर्भ है। किसी भी पृष्ठभूमि ऑपरेशन में आप एक ही प्रबंधित ऑब्जेक्ट स्टोर के आधार पर एक नया संदर्भ बनाते हैं, फिर संपादन करते समय इसे सहेजते हैं - एक विशेष अधिसूचना है जिसे आप देख सकते हैं, उस विधि में आप मुख्य संदर्भ में विलय का अनुरोध कर सकते हैं। Http://stackoverflow.com/questions/1429900/coredata-and-mergechangesfromcontextdidsavenotification –

+0

ठीक है, मैं देख रहा हूं कि आप क्या कह रहे हैं, धन्यवाद, अगर आपको कोई बात नहीं है तो मैं कुछ और प्रश्न पूछना चाहूंगा, मुझे यह साइट पता है वास्तव में एक चर्चा के लिए स्थापित नहीं है ... आपको 'NSManagedObject की गुणों को @ गतिशील होने की आवश्यकता क्यों है? यदि आप उन्हें डोमेन ऑब्जेक्ट्स के रूप में उपयोग करना चाहते हैं, तो @synthesize का उपयोग करना आसान नहीं होगा, लेकिन जब मैं इसे बदलता हूं तो मुझे त्रुटियां मिलती हैं ... – Mark

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