मुझे आईक्लाउड शूबॉक्स एप्लिकेशन के साथ कोई समस्या है और उम्मीद है कि कोई मेरी मदद कर सकता है (मैंने इसे व्यर्थ में लड़ने में कई घंटे बिताए हैं)।iCloud + CoreData - प्री-भरे डेटा डुप्लिकेशन से कैसे बचें?
ऐप: - एक साधारण लाइब्रेरी शैली अनुप्रयोग - जिसमें श्रेणियों का सेट (Cat1 .. CatN) प्रत्येक आइटम (आइटम 1 ... आइटमएम) शामिल है। मैंने iCloud CoreData स्टैक सेट अप करने के लिए ऐप्पल के iPhoneCoreDataRecipes का उपयोग किया।
सबकुछ iCloud के साथ लगभग सही काम करता है सिवाय इसके कि उपयोगकर्ता पहली बार ऐप खोलने के बाद उपयोग करने शुरू कर सकता है (वह उस समय ऑफ़लाइन भी हो सकता है)। और यहाँ शैतान है।
यहाँ मैं क्या करना है - एक बार जब मेरी persistentStoreCoordinator सेटअप है मैं अधिसूचना
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter]
postNotificationName: @"RefetchAllDatabaseData"
object: self
userInfo: nil];
});
जो मेरे MasterViewController द्वारा प्राप्त होता है भेजें। जब अधिसूचना प्राप्त होती है MasterViewController स्टोरेज में श्रेणियों की संख्या की जांच करता है। यदि उपलब्ध श्रेणियों की संख्या 0 के बराबर है - पूर्व-भरे श्रेणियां डाली जाती हैं।
FYI करें - मैं NSMergeByPropertyObjectTrumpMergePolicy का उपयोग अपने ManagedObjectContext
समस्या के लिए: यह 1 डिवाइस के लिए अच्छी तरह से काम करता है। लेकिन दूसरे डिवाइस के लिए iCloud से डिफ़ॉल्ट श्रेणियां अक्सर को लगातार स्थापित करने के बाद प्राप्त किया गया हैस्टोरऑर्डिनेटर स्थापित किया गया है (और दूसरी डिवाइस द्वारा डिफ़ॉल्ट श्रेणियां डाली गई हैं)। अंत में मेरे पास दोनों उपकरणों पर समान नाम वाले श्रेणियों के 2 सेट हैं।
कोई विचार यह कैसे हल किया जा सकता है?
प्रयास किए गए समाधान: मैंने इसे हल करने के लिए 2 रणनीतियों की कोशिश की। दोनों एक ही तरह से शुरू करते हैं। बाद मैं
[moc mergeChangesFromContextDidSaveNotification: note];
फोन मैं उसके संदर्भ कोड के लिए https://devforums.apple.com/thread/126670?start=400&tstart=0 से जोस इनेस Cantu Arrambide को
[self materializeKeysWithUserInfo: note.userInfo forContext: moc];
बहुत धन्यवाद कहते हैं - संक्षेप में
materializeKeysWithUserInfo:forContext:
note.userInfo और retrieves से managedObjectIds मिल ManagedObjectContext से संबंधित ऑब्जेक्ट्स को उन्हें एक शब्दकोश में डाल दें।
रणनीति 1:
- मेरे सभी श्रेणियों के निर्माण के समय-टिकटों की है।
- iCloud से डालने पर, एक ही नाम के साथ श्रेणियों में से जोड़े मिल यदि कोई
- बड़े नकली श्रेणियों का चयन करें
- हटाना पुराने डुप्लिकेट श्रेणियां
ये रणनीति को प्रभावी ढंग से नए डुप्लिकेट श्रेणियों के लिए अपने आइटम के लिए कदम यूआई में दिखाई देने से पहले दोनों उपकरणों पर डुप्लिकेट हटा देता है लेकिन
1) 1 डी से आइटम दूसरे डिवाइस पर उपाध्यक्ष खो रहे हैं - जब वे दूसरे डिवाइस पर आते हैं तो उनकी मूल श्रेणी अनुपस्थित होती है और उनकी श्रेणी फ़ील्ड बराबर होती है इसलिए मुझे नहीं पता कि उन्हें कहां रखा जाए।
2) कुछ कम समय आइटम है कि 2 डिवाइस पर खो गया भी संघर्ष की वजह से पहले पर खो रहा है कर रहे हैं।
3) 2 डिवाइस से होने वाले कुछ आइटम भी संघर्ष की वजह से खो जाते हैं।
मैं नए के खिलाफ बड़े श्रेणियों पसंद करते हैं करने की कोशिश की, लेकिन यह कोई असर
रणनीति 2 हार नहीं मानी:
- मेरे सभी श्रेणियों के निर्माण के समय-टिकटों की है।
- सभी श्रेणियों अप्रचलित बूलियन क्षेत्र iCloud से निर्माण
- पर नहीं करने के लिए सेट है डालने पर, एक ही नाम के साथ श्रेणियों में से जोड़े मिल यदि कोई
- बड़े नकली श्रेणियों का चयन करें
- नए के लिए अपने आइटम ले जाने डुप्लिकेट श्रेणियां
- निशान अप्रचलित के साथ पुराने श्रेणियों = हाँ
ये रणनीति लगभग हमेशा दोनों उपकरणों पर डुप्लिकेट पहले भी वे यूआई में दिखाई देते हैं, लेकिन निकालता है
दोनों उपकरणों से आइटम के बहुमत (या सभी) श्रेणियों पर संघर्ष की एक गुच्छा के कारण खो हो रहे हैं और वस्तुओं।
कुछ समापन विचार:
ऐसा लगता है कि इन रणनीति की तरह के रूप में हम एक साथ सामग्री ओब जबकि iCloud दोनों उपकरणों इस तरह के पैटर्न के लिए उपयुक्त नहीं है बदलना शुरू काम नहीं करता।
मेरी परीक्षणों में मैं एक साथ चल दोनों उपकरणों था। मैं एक ऐसे मामले की उपेक्षा नहीं कर सकता जब एक खुश उपयोगकर्ता जिसने अपना दूसरा iDevice खरीदा है, मेरे ऐप को दूसरे डिवाइस पर इंस्टॉल करता है (ऐप चलाने वाले पहले डिवाइस के साथ) और मिनटों के मामले में अपने सभी आइटम खो देते हैं।
कोई भी विचार कैसे इस स्थिति को हल किया जा सकता है? क्या आपको लगता है कि iCloud + CoreData उत्पादन के लिए तैयार है?
रणनीति 3
मैं उचित पथ के लिए एक पहले से भरे डेटाबेस (बंडल से कॉपी) डाल करने के लिए कोशिश की है। यह आंशिक रूप से काम करता है - मेरे पास पूर्व-भरे श्रेणियों की नकल नहीं है लेकिन प्री-भरे श्रेणियों में जोड़े गए आइटम डिवाइस पर सिंक्रनाइज़ नहीं करते हैं।
iCloud iCloud सेटअप से पहले डेटाबेस में मौजूद डेटा से अवगत नहीं है - मेरा दूसरा डिवाइस श्रेणी = शून्य के साथ पूर्व-भरे श्रेणियों में पहले डिवाइस पर डाले गए आइटम प्राप्त करता है।
iCloud सेटअप ठीक से सिंक्रनाइज़ करने के बाद स्टोरेज में डाले गए अतिरिक्त श्रेणियों (साथ ही साथ श्रेणियां स्वयं) में आइटम डाले गए हैं।
Konstiantyn, मैंने देव पर आपकी बातचीत का पालन किया है। साइट। मैं वास्तव में यहां प्रश्न जोड़ने की सराहना करता हूं - मेरी इच्छा है कि और अधिक टिप्पणियां हों! क्या यह रणनीति आपके लिए काम करती है? क्या आपने ShareCoreData नमूना के रूप में प्रीबिल्ट लोकस्टोर रखने पर विचार किया था? सादर –
आप अपनी श्रेणियों का नाम बदल सकते हैं, जब तक कि आप सिस्टम-निर्मित रिकॉर्ड और उपयोगकर्ता द्वारा बनाए गए रिकॉर्ड के बीच अंतर कर सकें। मैंने 'createDate' और' updateDate' विशेषताएँ 'की एक जोड़ी का उपयोग किया [यह निर्धारित करता है कि डेटा आइटम को डी-डुप्लिकेट किया जाना चाहिए] (http://cutecoder.org/programming/seeding-icloud-core-data/)। – adib
हाय दोस्तों, मुझे 2 साल पहले किसी बिंदु पर रुकना पड़ा और तब से कोरडाटा + आईक्लाउड की समीक्षा नहीं की गई। @adib - आपकी टिप्पणी के लिए धन्यवाद। यदि आवश्यक हो तो मैं बाद में इस तकनीक का उपयोग करूंगा। –