2014-06-11 7 views
5

आधिकारिक दस्तावेज़ क्लाउडकिट स्थिरता के बारे में कहीं बात करते हैं? मेरे परीक्षण के अनुसार यह अंततः संगत प्रतीत होता है - यह काम हो सकता है और नहीं भी हो सकता (खाली परिणाम देने) लेखन के तुरंत बाद एक रिकार्ड पढ़ने:क्या क्लाउडकिट दृढ़ता से संगत है, या अंततः संगत है?

CKDatabase *database = [[CKContainer defaultContainer] publicCloudDatabase]; 
CKRecord *record = [[CKRecord alloc] initWithRecordType:@"Foo"]; 

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); 
[database saveRecord:record completionHandler:^(CKRecord *record, NSError *error) { 
    CKQuery *query = [[CKQuery alloc] initWithRecordType:@"Foo" predicate:[NSPredicate predicateWithFormat:@"TRUEPREDICATE"]]; 
    [database performQuery:query inZoneWithID:nil completionHandler:^(NSArray *results, NSError *error) { 
     XCTAssertEqualObjects(results, @[], @"Freshly written object not returned by query."); // succeeds 
     dispatch_semaphore_signal(semaphore); 
    }]; 
}]; 

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); 

वहाँ एक जोरदार लगातार पढ़ने कि सभी को प्रतिबिंबित करेगा मजबूर करने के लिए एक रास्ता है पिछले अपडेट?

+0

मैं अपने परीक्षणों में एक ही चीज़ को देख रहा हूं। मैं एक रिकॉर्ड सहेज रहा हूं और इसके लिए सफलतापूर्वक पूरा करने का इंतजार कर रहा हूं। यदि मैं फिर सभी रिकॉर्ड के लिए एक क्वेरी करता हूं, तो मेरा नया रिकॉर्ड वापस नहीं किया जाता है। क्या आपको कोई जानकारी मिली है कि क्लाउडकिट अंततः संगत है? –

+0

मेरा उपयोग मामला सौभाग्य से बहुत सरल था, इसलिए मैंने डेटास्टोर परत में एक प्रकार का कैश के साथ समस्या हल की: जब डेटा को डेटास्टोर में डाला जाता है, तो यह क्लाइंट पर थोड़ी देर के लिए संग्रहीत iCloud _and_ पर लिखा जाता है। और जब डेटास्टोर परत पूछताछ की जाती है, तो यह परिणाम सेट में रहने वाले कैश रिकॉर्ड जोड़ती है। बेवकूफ, लेकिन काम करता है। – zoul

+1

@zoul कभी इसे संभालने का बेहतर तरीका ढूंढता है? संशोधित करने के लिए CKModifyRecordsOperation.h में इनलाइन टिप्पणी का अंतिम भाग RecordsCompletionBlock सुझाव देता है कि यह डिज़ाइन किया गया व्यवहार है: "** यह कॉल होता है जैसे ही सर्वर में सभी रिकॉर्ड परिवर्तन देखे जाते हैं, और सर्वर को संसाधित करते समय भी लागू किया जा सकता है उन परिवर्तनों के प्रभाव । ** " – George

उत्तर

0

"अंतिम स्थिरता" शब्द के साथ मेरा एकमात्र अनुभव कॉच डीबी का उपयोग करने से है, जो अंततः संगत है। क्लाउडकिट कॉच डीबी से बहुत अलग है कि कॉच डीबी वितरित डेटाबेस को दोहराने की अनुमति देता है, जबकि क्लाउडकिट केवल "आईक्लाउड सर्वर से डेटा के हस्तांतरण के प्रबंधन के लिए सेवाएं" प्रदान करता है - यह केवल एक परिवहन तंत्र है।

मुझे पूरा यकीन है कि परिवहन तंत्र स्वयं अंततः संगत नहीं है - यह सीधे क्लाउडकिट सर्वर से बचाता है और पुनर्प्राप्त करता है।

चूंकि क्लाउडकिट केवल एक परिवहन तंत्र है, इसलिए आप अपने स्थानीय कैश/डेटाबेस को बनाए रखने के लिए जिम्मेदार हैं। आपका स्थानीय डेटाबेस अंततः संगत माना जाएगा, क्योंकि यह सिंक के बीच जरूरी नहीं है, और जब आप अंततः क्लाउडकिट का उपयोग करके इसे सिंक करते हैं तो केवल संगत हो जाता है।

अब, आप कहते हैं कि आपके परीक्षणों में आप सहेज रहे हैं और फिर रिकॉर्ड पुनर्प्राप्त करने का प्रयास कर रहे हैं। लेकिन मुझे आपके कोड में नोटिस है कि आप सहेजने के ऑपरेशन में त्रुटियों की जांच नहीं कर रहे हैं। तो, शायद सहेजने के दौरान कोई त्रुटि है जो आप गायब हैं?

+0

मुझे ऐप्पल के आईक्लाउड इंफ्रास्ट्रक्चर के बारे में पता नहीं है, लेकिन मुझे संदेह है कि कई अलग-अलग आईक्लाउड सर्वर किसी प्रकार की लोड बैलेंसिंग योजना के पीछे चल रहे हैं।तो ऐसा लगता है कि रिकॉर्ड को सहेजने के लिए एक कॉल को एक सर्वर इंस्टेंस पर भेजा जा सकता है, जबकि बाद में कॉल को एक अलग उदाहरण में भेज दिया जाता है। ICloud कितनी अच्छी तरह से उन उदाहरणों को सिंक में रखता है, इस पर निर्भर करता है कि एक अंतिम स्थिरता मॉडल होने की अपेक्षा यहां उचित हो सकती है। –

7

यह दोनों में से एक छोटा सा है: क्लाउडकिट दृढ़ता से संगत है यदि आप पहचानकर्ता द्वारा रिकॉर्ड प्राप्त करते हैं, लेकिन आखिरकार एक क्वेरी के साथ रिकॉर्ड प्राप्त करते समय लगातार संगत होता है।

जब CKModifyRecordsOperation सफलतापूर्वक लौटाता है तो रिकॉर्ड तुरंत इसके पहचानकर्ता द्वारा प्राप्त किया जा सकता है।

हालांकि, सर्वर के रिकॉर्ड के मूल्यों को स्कैन करने और इसकी खोज अनुक्रमणिका को अपडेट और वितरित करने में कुछ समय लगता है। जब तक कि अनुक्रमण पूरा नहीं हो जाता तब तक आपको किसी भी प्रश्न में रिकॉर्ड नहीं दिखाई देगा।

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