2012-04-17 14 views
6

निम्नलिखित सरल इकाई मॉडल पर विचार करें: एंटिटी ए के पास बी नामक एंटिटी बी के साथ एक से एक संबंध है। एंटिटी बी में नामक एक रिश्तेदार संबंध है। न तो रिश्ते वैकल्पिक है।कोर डेटा iCloud सिंक्रनाइज़ेशन

A   B 
b < ----- > a 

मान लें हम दो उपकरणों (1) और (2) कि पूरी तरह से सिंक किए गए शुरू की है। प्रत्येक में कक्षा ए का एक वस्तु है, और कक्षा बी का एक वस्तु है, और वे एक-दूसरे से जुड़े हुए हैं। डिवाइस 1 पर, हमारे पास ऑब्जेक्ट ए 1 और बी 1 है, और डिवाइस बी पर हमारे पास समान लॉजिकल ऑब्जेक्ट्स A1 और B1 हैं।

अब मान लेते हैं कि simulateous परिवर्तन प्रत्येक डिवाइस पर बने होते हैं:

डिवाइस 1 पर, हम, बी 1 हटाना बी 2 डालें, और बी 2 के साथ संबद्ध A1। फिर परिवर्तनों को सहेजें।
डिवाइस 2 पर, हम बी 3 के साथ बी 1, बी 3 डालने, और सहयोगी A1 को हटा दें। फिर परिवर्तनों को बचाओ।

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

डिवाइस 2 पर कुछ समान होगा, क्योंकि दो बी ऑब्जेक्ट्स हैं, और केवल एक ऑब्जेक्ट से जुड़ा हुआ है। इस प्रकार हमेशा एक सत्यापन त्रुटि होनी चाहिए, क्योंकि बी वस्तुओं में से एक को संबंध शून्य पर सेट होना चाहिए।

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

सवाल, कैसे आप इस प्रकार का सत्यापन त्रुटि का समाधान कर सकते है? यह सब NSPersistentStoreDidImportUbiquitousContentChangesNotification अधिसूचना ट्रिगर होने से पहले होता है। यह आपकी ऐप्लिकेशन मुख्य NSManagedObjectContext में एक प्रमाणीकरण त्रुटि नहीं है, यह एक प्रमाणीकरण त्रुटि है कि लगातार दुकान में हस्तांतरण लॉग की प्रारंभिक आयात के दौरान होता है।

ही एकमात्र विकल्प मैं के बारे में सोच सकते हैं शायद, या, क्योंकि इन होने लगते हैं एक कस्टम सेटर (setA:) में अवैध बी वस्तु को हटाने का प्रयास करने के लिए बी वर्ग पर ही एक KVC सत्यापन विधि (validateA:error:) में है लेनदेन लॉग आयात के दौरान ट्रिगर। लेकिन मुझे यकीन नहीं है कि इन जैसे साइड इफेक्ट्स की अनुमति है, और जब मैं इसे आज़माता हूं, तो ऐसा लगता है कि उस प्रभाव में ग़लत लॉग संदेश हैं।

किसी को भी पता है कि सही तरीके से क्या संभाल करने है? पर एप्पल के डेवलपर फ़ोरम इस सूत्र बाहर

उत्तर

2

की जांच:

https://devforums.apple.com/message/641930#641930

एक एप्पल कर्मचारी से एक प्रतिक्रिया है। संक्षेप में:

1) इस कोर डाटा iCloud में एक ज्ञात बग, iOS (5.1) और ओएस एक्स (10.7.3) के वर्तमान संस्करण के तहत सिंक कर रहा है।

2) यदि संबंध वैधता के साथ गैर-वैकल्पिक है, तो समन्वयन पूरी तरह से समाप्त हो जाएगा। इसलिए आपको चीजों को बहने के लिए समय-समय पर सत्यापन को हटाने की आवश्यकता होगी। हालांकि, ऐसा करने से डिवाइस को बेमेल डेटा के साथ छोड़ दिया जाएगा।

3) इसके लिए कोई आधिकारिक समाधान नहीं है। एक दृष्टिकोण, जो गन्दा है, एक अलग विशेषता बनाए रखना होगा जो संबंधों को ट्रैक करता है। फिर, आपको iCloud के माध्यम से किसी भी ऑब्जेक्ट को स्कैन करना होगा और अगर यह शून्य है तो रिश्ते को ठीक करना होगा।

मुझे भी इस बग द्वारा काटा गया है। परेशानियों में भाग लेने वाले ग्राहकों से निपटने के लिए बहुत निराशाजनक। उम्मीद है कि ऐप्पल से जल्द ही बाहर निकल जाएगा ...

+0

धन्यवाद, यह बहुत उपयोगी है। देव फोरम पोस्ट यह इंगित करता है कि यह कई रिश्तों के लिए केवल एक समस्या है, लेकिन मुझे नहीं लगता कि यह मामला है। यह किसी भी परिस्थिति में उभर जाएगा जहां एक आवश्यक संबंध एक साथ संशोधित किया जाता है। किसी भी मामले में, कम से कम मुझे पता है कि यह ढांचे में एक बग है और इसके आसपास काम करने की कोशिश कर सकते हैं। –

+0

क्या यह समस्या अभी भी 6.x और 10.8.x में होती है? –

+0

दुर्भाग्य से, हाँ, यह अभी भी आईओएस 6.1 में एक समस्या के रूप में मौजूद है। – thevoid

1

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

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

-(BOOL)validateValue:(__autoreleasing id *)value forKey:(NSString *)key error:(NSError *__autoreleasing *)error 
{ 
    if (![self.managedObjectContext isKindOfClass:[MCManagedObjectContext class]]) { 
     return YES; 
    } 
    else { 
     return [super validateValue:value forKey:key error:error]; 
    } 
} 

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

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

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