2014-07-16 9 views
6

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

समस्या तब होती है जब मैं एक नया मूवी रिकॉर्ड बनाता हूं, जबकि दूसरा उपयोगकर्ता एक ही नाम के साथ एक नया रिकॉर्ड बनाता है (फिल्मों की सूची को पुनर्प्राप्त करने के बाद, लेकिन इससे पहले कि मैं एक नया जोड़ने का प्रयास करता हूं)। दो नए रिकॉर्ड अलग-अलग रिकॉर्ड आईडी के साथ अलग-अलग रिकॉर्ड मानते हैं। इसका मतलब है कि एक बार जब मैंने नया सहेजा, तो सहेजने वाले नामों के साथ मूवीज़ के दो उदाहरण होंगे।

मैं मूवी रिकॉर्ड प्रकार में सहेजने के लिए एक प्रकार का अस्तित्व टाइप करने का तरीका नहीं ढूंढ पा रहा हूं। मैं पूरा होने में एक बचत कर सकता हूं एक प्रश्न की जांच, लेकिन उन दो कार्यों को विशिष्टता की गारंटी के लिए परमाणु लेनदेन नहीं होगा। जहां तक ​​मुझे पता है कि यह CKQueryOperation चेनिंग CKModifyRecordsOperation के साथ भी मामला है।

क्या केवल एक रिकॉर्ड डालने का कोई तरीका है यदि मूल्य एक लेनदेन में मौजूद नहीं है?

उत्तर

6

अगर मैं सही ढंग से समझ आपके उपयोग के मामले, आप movieRecord.recordID.recordName फिल्म के नाम बनाने के लिए और CKModifyRecordsOperationsavePolicy साथ IfServerRecordUnchanged का उपयोग प्रभावी रूप से बचाने के लिए नहीं मौजूद है, तो कर सकते हैं। यह तो एक त्रुटि है कि आप उपेक्षा कर सकते हैं वापसी अगर आप किसी रिकॉर्ड कि पहले से ही सर्वर पर मौजूद है को बचाने की कोशिश करेंगे:

let saveRecordsOperation = CKModifyRecordsOperation() 
saveRecordsOperation.recordsToSave = [movieRecord] 
saveRecordsOperation.savePolicy = .IfServerRecordUnchanged 
savePolicy IfServerRecordUnchanged अगर यह अभी तक मौजूद नहीं है इस आपरेशन एक नया मूवी रिकॉर्ड की बचत होगी साथ

सर्वर पर (सहेजें अगर मौजूद नहीं है) लेकिन किसी भी मूवी रिकॉर्ड को ओवरराइट करने के बाद किसी भी प्रकार की त्रुटि को वापस कर देगा जो सर्वर पर पहले से मौजूद है (बशर्ते यह सर्वर से प्राप्त रिकॉर्ड का नया संशोधित संस्करण न हो):

<CKError 0x14d23980: "Server Record Changed" (14/2017); server message = "record to insert already exists"> 

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

+0

दुर्भाग्यवश यह मेरे लिए काम नहीं करता है। मैं सूची में जोड़ने के लिए movieRecord का एक नया उदाहरण बना रहा हूं। यदि किसी अन्य उपयोगकर्ता ने उसी नाम के साथ एक रिकॉर्ड बनाया (जब मैंने फिल्मों की सूची पुनर्प्राप्त की, लेकिन इससे पहले कि मैं एक नया जोड़ने का प्रयास करता हूं), उन्हें अलग-अलग रिकॉर्ड माना जाता है क्योंकि उनके पास अलग-अलग रिकॉर्ड आईडी हैं। इसका मतलब है कि भले ही मेरी savePolicy को IfServerRecordUnchanged पर सेट किया गया हो, ऑपरेशन कोई त्रुटि नहीं फेंकता है। इसके बजाय मैं एक ही नाम के साथ दो अलग-अलग रिकॉर्ड देखूंगा। – Denis

+0

समझ गया। यह काम करेगा यदि आपने movieRecord.recordID.record फिल्म के नाम का नाम दिया है। मेरे पास सार्वजनिक डेटाबेस का उपयोग कर एक समान उपयोग केस है और यही वह है जो मैं सार्वजनिक रिकॉर्ड अद्वितीय रखने के लिए कर रहा हूं। मैंने धारणा को ध्यान में रखते हुए जवाब में एक संपादन किया। –

+0

अच्छा विचार, यह काम मेरे लिए यह करेगा। धन्यवाद! – Denis

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