2012-02-01 10 views
15

मुझे आईक्लाउड शूबॉक्स एप्लिकेशन के साथ कोई समस्या है और उम्मीद है कि कोई मेरी मदद कर सकता है (मैंने इसे व्यर्थ में लड़ने में कई घंटे बिताए हैं)।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 सेटअप ठीक से सिंक्रनाइज़ करने के बाद स्टोरेज में डाले गए अतिरिक्त श्रेणियों (साथ ही साथ श्रेणियां स्वयं) में आइटम डाले गए हैं।

उत्तर

3

कुछ संशोधनों के साथ रणनीति 1 एक कामकाजी समाधान (हालांकि कुछ त्रुटियों के साथ) दिखाई दिया।

लीजेंड:

  • 1 डिवाइस - iCloud
  • 2 डिवाइस में किसी भी सामग्री के बिना ऑनलाइन शुरू कर दिया - पहले और ऑफ़लाइन की तुलना में बाद शुरू कर दिया।के बाद कुछ आइटम

जोड़ा तो यह ऑनलाइन हो जाता है तो यहाँ अद्यतन रणनीति है:

  • मेरे सभी श्रेणियों है निर्माण समय टिकटों

  • श्रेणियों का नाम नहीं बदला जा सकता है (केवल जोड़ा या हटाया गया - यह महत्वपूर्ण है)

  • मेरे सभी आइटम हा एक स्ट्रिंग श्रेणीनाम फ़ील्ड है जो आइटम निर्माण पर अपना मूल्य प्राप्त करता है और जब भी आइटम किसी अन्य श्रेणी में स्थानांतरित हो जाता है - यह अनावश्यक जानकारी सफलता प्राप्त करने में सहायता करती है;

के नए श्रेणियाँ प्रविष्टि पर:

  • iCloud से डालने पर, मैं ही नाम के साथ श्रेणियों में से जोड़े मिल यदि कोई

  • करें नए डुप्लिकेट श्रेणियां (वे शायद सबसे पुराने लोगों की तुलना में कम आइटम होंगे इसलिए हमारे पास iCloud में कम नृत्य होगा)

  • यदि कोई बड़े डुप्लिकेट श्रेणियों के लिए उनके आइटम का स्थान बदलें

  • नए डुप्लिकेट श्रेणियां

नई आइटम की प्रविष्टि पर हटाएँ - यदि आइटम के अंतर्गत आता है नष्ट कर दिया श्रेणी:

  • कोरडाटा इसे मर्ज करने का प्रयास करता है और विफल रहता है क्योंकि कोई मूल श्रेणी नहीं है (कंसोल में बहुत सारी त्रुटियां)। यह बाद में इसे सम्मिलित करने का वादा करता है।

  • कुछ कम समय के बाद यह विलय और भंडारण में आइटम डालने लेकिन शून्य श्रेणी के साथ

  • यहाँ हम हमारे आइटम लेने, पता लगाने के लिए यह categoryname से पैरेंट श्रेणी है और यह करने के लिए रखा है सही श्रेणी

वोला! - कोई & हर कोई खुश

कुछ नोट डुप्लिकेट: (उन है कि 1 डिवाइस के लिए नहीं के बराबर श्रेणी के साथ आ जाएगा) दोनों उपकरणों पर

  1. मैं 2 डिवाइस से संबंधित मदों की एक नृत्य मिलता है।मिनट के बाद सब कुछ की एक जोड़ी स्थिर है
  2. कोई आइटम नहीं हालांकि
  3. नृत्य केवल 2 के पहले iCloud सिंक पर होता है (या किसी अन्य बाद में डिवाइस)
  4. खो दिया है 2 डिवाइस ऑनलाइन शुरू कर दिया गया है, तो पहली बार ऐसा लगता है कि डुप्लिकेट श्रेणियों का मामला केवल 25% है - 3 जी कनेक्शन पर परीक्षण किया गया है - इसलिए नृत्य उपयोगकर्ताओं के बहुमत को प्रभावित नहीं करना चाहिए
+0

Konstiantyn, मैंने देव पर आपकी बातचीत का पालन किया है। साइट। मैं वास्तव में यहां प्रश्न जोड़ने की सराहना करता हूं - मेरी इच्छा है कि और अधिक टिप्पणियां हों! क्या यह रणनीति आपके लिए काम करती है? क्या आपने ShareCoreData नमूना के रूप में प्रीबिल्ट लोकस्टोर रखने पर विचार किया था? सादर –

+0

आप अपनी श्रेणियों का नाम बदल सकते हैं, जब तक कि आप सिस्टम-निर्मित रिकॉर्ड और उपयोगकर्ता द्वारा बनाए गए रिकॉर्ड के बीच अंतर कर सकें। मैंने 'createDate' और' updateDate' विशेषताएँ 'की एक जोड़ी का उपयोग किया [यह निर्धारित करता है कि डेटा आइटम को डी-डुप्लिकेट किया जाना चाहिए] (http://cutecoder.org/programming/seeding-icloud-core-data/)। – adib

+0

हाय दोस्तों, मुझे 2 साल पहले किसी बिंदु पर रुकना पड़ा और तब से कोरडाटा + आईक्लाउड की समीक्षा नहीं की गई। @adib - आपकी टिप्पणी के लिए धन्यवाद। यदि आवश्यक हो तो मैं बाद में इस तकनीक का उपयोग करूंगा। –

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