हम एंटरप्राइज़-स्तरीय एप्लिकेशन पर काम कर रहे हैं, जो कोर डेटा के साथ हजारों ऑब्जेक्ट्स स्टोर करेगा, और हमें कई मोर्चों पर समस्याएं हैं।कोर डेटा प्रबंधित ऑब्जेक्ट संदर्भ डिजाइन अनुशंसा
हमारे एप्लिकेशन में कई स्वतंत्र सिस्टम हैं जो आवश्यक होने पर डेटा पर काम करते हैं। इन प्रणालियों में वस्तुओं की खोज, वस्तुओं की लोडिंग, सिंक्रनाइज़ेशन और यूआई डिस्प्ले शामिल हैं। यदि हम अपने सॉफ़्टवेयर को सही तरीके से डिज़ाइन करते हैं, तो अलग-अलग सिस्टमों को संशोधित करने वाले विभिन्न सिस्टमों के कारण विवादों को मर्ज करने के लिए बहुत कम होना चाहिए। प्रत्येक प्रणाली में अपनी खुद की ऑपरेशन कतार होती है, जो पृष्ठभूमि में प्रदर्शन करती हैं। हम UI प्रदर्शन समस्याओं को कम करने के लिए पृष्ठभूमि में सभी ऑब्जेक्ट सृजन और संशोधन को रखना चाहते हैं, खासकर प्रारंभिक रैंप अप के दौरान, जहां सर्वर पर डेटा से हजारों ऑब्जेक्ट्स बनाए जा सकते हैं। यहां हमने अपने विभिन्न डिजाइन प्रयासों के साथ कई समस्याएं निभाई हैं। इन रैंप अप के दौरान बड़ी मेमोरी खपत, और सभी संदर्भों और बाल संदर्भों के गलत ऑर्केस्ट्रेशन, जिससे डेडलॉक्स और क्रैश होते हैं। NSPrivateQueueConcurrencyType
प्रबंधित वस्तु संदर्भ में जो एक बच्चे NSMainQueueConcurrencyType
संदर्भ है
- एक जड़: हम निम्नलिखित डिजाइन प्रयास किया है। यूआई प्राप्त परिणाम नियंत्रक परिणाम प्राप्त करने के लिए इस बच्चे के संदर्भ का उपयोग करते हैं।
NSMainQueueConcurrencyType
बाल संदर्भ से, हमने एकNSPrivateQueueConcurrencyType
बाल संदर्भ बनाया, जिसे हमने "saveContext" कहा था और प्रत्येक पृष्ठभूमि ऑपरेशन ने उस "बचत कोटेक्स्ट" का एक बाल संदर्भ बनाया, इसके परिवर्तन हुए, और आखिरकार हमने "गहरी बचत" कहा, जिसे हम दोहराते हैं शीर्ष पर बचत। हमने शुरुआत में इस डिजाइन को कई अलग-अलग बाल संदर्भों सेNSManagedObjectContextDidSaveNotification
अधिसूचनाओं से निपटने के लिए नहीं चुना है। हमने प्रत्येक कॉल कोNSPrivateQueueConcurrencyType
संदर्भों औरperformBlockAndWait:
के साथ ऑब्जेक्ट तक पहुंचने के लिए लपेट लिया। कार्यात्मक रूप से, इस डिजाइन प्रदर्शन किया। सभी परिवर्तन और आवेषण लगातार स्टोर में सहेजे गए थे, और यूआई को परिवर्तनों के साथ अपडेट किया गया था। इसने दो मुद्दों की शुरुआत की।NSMainQueueConcurrencyType
बाल संदर्भ के माध्यम से विलय किए गए परिवर्तनों के कारण रैंप अप के दौरान एक लगी यूआई था, और अधिक महत्वपूर्ण बात यह है कि रैंप अप के दौरान बहुत अधिक मेमोरी उपयोग होता है। पर कॉल करने के दौरान संदर्भों पर पुनरावर्ती रूप सेreset
पर कॉल करने में असमर्थता के कारण हम निषिद्ध RAM उपयोगों को प्रभावित करेंगे (क्योंकि मुख्य यूआई बाल संदर्भ भी है) और/या ज्ञान की कमी के समयrefreshObject:mergeChanges:
पर कॉल करें। तो हम एक अलग सड़क चले गए। - यूआई डिस्प्ले के लिए लगातार स्टोर समन्वयक,
NSPrivateQueueConcurrencyType
और यूआई डिस्प्ले के लिएNSMainQueueConcurrencyType
के साथ जुड़े दो शीर्ष-स्तरीय संदर्भ हैं।NSMainQueueConcurrencyType
मुख्यNSPrivateQueueConcurrencyType
संदर्भ सेNSManagedObjectContextDidSaveNotification
सूचनाओं को सुनता है और उन्हें मुख्य धागे में विलीन करता है। प्रत्येक पृष्ठभूमि ऑपरेशन मुख्यNSPrivateQueueConcurrencyType
संदर्भ का एक बाल संदर्भ बनाता है, निजी कतार समरूपता प्रकार के साथ भी, जो करता है, वह "गहरी बचत" करता है, जो वर्तमान संदर्भ पर सहेजता है, इसकी गहरी बचत की एक पुनरावर्ती कॉल अभिभावक, वर्तमान संदर्भ पर रीसेट कॉल करता है और फिर से बचाता है। इस तरह हम स्मृति समस्याओं से बचते हैं, क्योंकि सहेजे गए सामानों को सहेजने के तुरंत बाद जारी किया जाता है। हालांकि, इस डिज़ाइन के साथ, हमनेNSMainQueueConcurrencyType
संदर्भ के लिए अधिसूचनाओं को सहेजने के बावजूद मृत ताले,NSInternalInconsistencyException
अपवादों जैसे मुद्दों को प्राप्त किया है और यूआई को अपडेट नहीं किया है। यह यूआई में बहुत धीमा करने के लिए शुरुआती लोड समय भी पैदा करता है। पिछले डिज़ाइन में, प्राप्त किए गए परिणाम नियंत्रक ने परिणाम बहुत तेज़ कर दिए, जबकि यूआई ने दृश्य लोड होने तक कई सेकंड तक अवरुद्ध कर दिया है (हमviewDidLoad
में प्राप्त परिणाम नियंत्रक प्रारंभ करते हैं)।
हम कई मध्यवर्ती डिजाइन की कोशिश की है, लेकिन वे सभी एक ही मुद्दों के चारों ओर घूमना, या तो बहुत अधिक स्मृति उपयोग, प्राप्त किए गए परिणाम नियंत्रक यूआई या गतिरोध और NSInternalInconsistencyException
अपवाद अपडेट नहीं हो।
मैं वास्तव में निराश हो रहा हूं। मैं ऐसा महसूस नहीं कर सकता जैसे कि हमारे डिजाइन किसी चीज के लिए अत्यधिक जटिल हैं जो कि सरल होना चाहिए, और यह हमें कुछ मौलिक समझने की कमी है जो हमें मार रहा है।
तो आप लोग क्या सुझाव देंगे? आप हमारे संदर्भों के लिए किस व्यवस्था की सिफारिश करेंगे? हमें विभिन्न धागे में विभिन्न संदर्भों का प्रबंधन कैसे करना चाहिए? सम्मिलित वस्तुओं को मुक्त करने और संदर्भों को रीसेट करने के लिए सर्वोत्तम अभ्यास? मृत ताले से बचना? इस बिंदु पर सभी मदद की सराहना की जाएगी।
मैंने मैजिकल रिकॉर्ड्स श्रेणी के लिए भी सिफारिशें देखी हैं। क्या इसकी सिफारिश की जाती है? हम कोर डेटा प्रकारों का उपयोग करने में पहले ही निवेश कर चुके हैं, एमआर का उपयोग करके माइग्रेट करना कितना मुश्किल होगा?
मुझे समान समस्याएं हैं (आर्किटेक्चर एक): http://stackoverflow.com/questions/15999932/core-data-break-retain-cycle-of-the-parent-context/16008470 - किस तरह का आर्किटेक्चर क्या आप अंत में गए थे? कोई सुझाव? – Zyphrax
हमारे पास एक मुख्य संदर्भ और मूल रूट संदर्भ है। लेकिन मूल संदर्भ केवल सहेजने के लिए उपयोग किया जाता है, इसलिए हम इसे प्रत्येक सहेजने पर रीसेट करते हैं। हमारे पास असंख्य मुद्दे हैं। ऐसा लगता है कि बच्चे और माता-पिता के संदर्भों की इन नई विशेषताओं को अच्छी तरह से सोचा नहीं गया है और ऐप्पल द्वारा अभी भी कई बग्स अनुपस्थित हैं। –
मैं एक बच्चे एमओसी (मेनक्यूयू) के साथ रूट एमओसी (प्राइवेट क्यूयू) के साथ आर्किटेक्चर की तरफ झुका रहा हूं और ''' [self.managedObjectContext refreshObject: self mergeChanges: NO]; '' '' ' मेरे कुछ प्रबंधित ऑब्जेक्ट्स में '-डिडसेव'''। यह संबंधों के बीच बनाए रखने के चक्र को अलग करता है और सभी एमओसी वस्तुओं को हटाने की इजाजत देता है। NSPrivateQueueConcurrencyType के साथ केवल एमओसी एक अजीब मुद्दा प्रतीत होता है कि वे तुरंत ऑब्जेक्ट्स को डिलीकेट नहीं करेंगे बल्कि अगली बचत/रोलबैक पर। – Zyphrax