การใช้ Core Data, iCloud และ CloudKit สำหรับการซิงค์และสำรองข้อมูลและวิธีการทำงานร่วมกัน


111

ฉันอยู่ในช่วงแรกของการสร้างแอปที่ฉันต้องการบันทึกซิงค์และสำรองข้อมูล แอปจะไม่เก็บไฟล์ใด ๆ เพียงแค่ข้อมูลในฐานข้อมูล มันจะเป็น iOS 8 ขึ้นไปดังนั้นฉันจึงสามารถใช้ CloudKit ได้ ฉันได้ทำการวิจัยและยังไม่ชัดเจนว่า Core Data, iCloud และ CloudKit ทำงานร่วมกันอย่างไร

เท่าที่เข้าใจ CloudKit เป็นเพียงวิธีการรับและดึงข้อมูลไปยัง / จากระบบคลาวด์ CloudKit เป็นเพียงวิธีอื่นในการซิงค์ข้อมูลกับ iCloud หรือไม่?

คำถามของฉันคือ:

  1. หากฉันใช้ CloudKit ฉันยังจำเป็นต้องสร้างฐานข้อมูลหลักภายในเครื่องหรือไม่

    • ถ้าใช่มันจะซิงค์กับ iCloud โดยอัตโนมัติหรือฉันจะต้องเรียกวิธีการจัดเก็บไปยังทั้งสองที่?
  2. หากข้อมูลถูกเก็บไว้ในระบบคลาวด์เท่านั้นผู้ใช้จะสามารถเข้าถึงได้เมื่ออุปกรณ์ iOS ไม่ได้เชื่อมต่อกับอินเทอร์เน็ต ฉันอ่านว่า CloudKit จะมีแคชที่ จำกัด เท่านั้น

  3. จะทำงานอย่างไรหากไม่ได้เปิดใช้งานบัญชี iCloud

หากมีใครสามารถแยกย่อยสิ่งที่แต่ละเทคโนโลยีทำในกระบวนการบันทึกและซิงค์ฐานข้อมูลข้อมูลหลักแบบออฟไลน์และออนไลน์

ความเข้าใจปัจจุบันของฉันคือ:

  • Core Data ใช้ในการจัดเก็บข้อมูลในเครื่อง

  • iCloud ซิงค์ข้อมูลและจัดเก็บในระบบคลาวด์

  • CloudKit ให้ความสามารถในการจัดเก็บและจัดการข้อมูลในระบบคลาวด์ ??

ฉันหวังว่าฉันจะให้ข้อมูลเพียงพอสำหรับคำถามนี้เพื่อไม่ให้ถูกปิด


2
แม้ว่าฉันจะไม่ได้ทำการค้นคว้าเกี่ยวกับเรื่องนี้มากนัก แต่เท่าที่ฉันเข้าใจว่ามันไม่ได้เก็บไว้ในท้องถิ่น มันเหมือนกับบริการไคลเอนต์เซิร์ฟเวอร์ทั่วไป นั่นคือเหตุผลที่ไม่มีอินเทอร์เน็ตคุณไม่สามารถเข้าถึงฐานข้อมูลของคุณได้ และตามเอกสารหากผู้ใช้ไม่ได้เปิดใช้งานบัญชี icloud ในเวลานั้นคุณสามารถอ่านข้อมูลจากคอนเทนเนอร์สาธารณะเท่านั้น
Sachin

@ คุณยานช่วยแนะนำ
หน่อยได้ไหม

คำตอบ:


183

มันเป็นเช่นนี้:

  • ข้อมูลหลักของตัวเองเป็นข้อมูลในเครื่องโดยสมบูรณ์และไม่ทำงานกับบริการคลาวด์ใด ๆ ของ Apple โดยอัตโนมัติ
  • ข้อมูลหลักที่เปิดใช้งาน iCloudจะเปิดการซิงค์ผ่าน iCloud การเปลี่ยนแปลงใด ๆ ที่คุณบันทึกไว้ใน Core Data จะถูกเผยแพร่ไปยังระบบคลาวด์และการเปลี่ยนแปลงใด ๆ ที่เกิดขึ้นในระบบคลาวด์จะถูกดาวน์โหลดโดยอัตโนมัติ ข้อมูลจะถูกจัดเก็บทั้งใน iCloud และในไฟล์ที่เก็บถาวรในเครื่องดังนั้นจึงสามารถใช้งานได้แม้อุปกรณ์จะออฟไลน์ คุณไม่จำเป็นต้องเขียนโค้ดเฉพาะบนคลาวด์ใด ๆ คุณเพียงแค่ต้องเพิ่มการฟังสำหรับการเปลี่ยนแปลงที่เข้ามา (ซึ่งเหมือนกับการเปลี่ยนแปลงที่เกิดขึ้นในบริบทอ็อบเจ็กต์ที่มีการจัดการอื่น ๆ )
  • CloudKit ไม่เกี่ยวข้องกับ Core Data ไม่ใช่ระบบซิงก์ แต่เป็นระบบถ่ายโอน หมายความว่าเมื่อใดก็ตามที่คุณต้องการอ่าน / เขียนข้อมูลบนคลาวด์คุณต้องทำการเรียกใช้ CloudKit API อย่างชัดเจนเพื่อดำเนินการดังกล่าว ไม่มีอะไรเกิดขึ้นโดยอัตโนมัติ CloudKit ไม่จัดเก็บข้อมูลบนอุปกรณ์ดังนั้นข้อมูลจะไม่พร้อมใช้งานหากอุปกรณ์ออฟไลน์ CloudKit ยังเพิ่มคุณสมบัติบางอย่างที่ไม่มีให้กับ Core Data ด้วย iCloud เช่นข้อมูลที่แชร์สาธารณะและความสามารถในการดาวน์โหลดเพียงบางส่วนของชุดข้อมูลแทนที่จะเป็นข้อมูลทั้งหมด

หากคุณต้องการใช้ CloudKit กับ Core Data คุณจะต้องเขียนโค้ดที่กำหนดเองของคุณเองเพื่อแปลระหว่างอ็อบเจ็กต์ที่มีการจัดการและระเบียน CloudKit ไม่ใช่เรื่องที่เป็นไปไม่ได้ แต่เป็นการเขียนโค้ดมากกว่า มันอาจจะน่าเชื่อถือกว่า แต่ก็เร็วเกินไปที่จะพูดอย่างแน่นอน

ฉันเขียนบล็อกโพสต์ที่อธิบาย CloudKit จากมุมมองของคนที่เคยใช้ Core Data และ iCloud มาก่อน

อัปเดตมิถุนายน 2016: ตามเอกสารล่าสุดสำหรับNSPersistentStoreCoordinatorทุกสิ่งที่เกี่ยวข้องกับ Core Data ที่มี iCloud ถูกทำเครื่องหมายว่าเลิกใช้แล้ว ดังนั้นจึงควรหลีกเลี่ยงการพัฒนาใหม่


1
ในอดีตฉันเคยมีปัญหากับความเสียหายเมื่อใช้ Core Data กับ iCloud แต่ฉันไม่ได้ใช้มันมากนักตั้งแต่ iOS 7 ออกมา มันควรจะดีกว่านี้มาก ด้วย CloudKit มันเร็วเกินไปที่จะพูดเนื่องจากยังไม่เปิดตัวอย่างเป็นทางการ
Tom Harrington

3
@ Tom Harrington - คุณช่วยลอง Core Data กับ iCloud สำหรับ iOS 8 และแจ้งให้เราทราบความประทับใจของคุณได้ไหม ฉันเคยประสบกับความเสียหายมากมายใน iOS 7 เช่นกันและฝ่ายสนับสนุนของ Apple ก็ยืนยันข้อบกพร่องมากมาย ฉันหวังว่า iOS 8 จะนำความน่าเชื่อถือไปสู่ระดับที่ยอมรับได้ แต่อยากจะได้ยินจากคุณผู้เชี่ยวชาญ;)
hyouuu

1
ลองดู CKSIncrementalStore github.com/CloudKitSpace/CKSIncrementalStore
Nofel Mahmood

3
"คุณไม่จำเป็นต้องเขียนโค้ดเฉพาะระบบคลาวด์ใด ๆ คุณเพียงแค่ต้องเพิ่มการรับฟังสำหรับการเปลี่ยนแปลงที่เข้ามา (ซึ่งเหมือนกับการเปลี่ยนแปลงที่เกิดขึ้นในบริบทอ็อบเจ็กต์ที่มีการจัดการอื่น ๆ )" - คุณมีตัวอย่างโค้ด / ตัวอย่างในความคิดเห็นนี้หรือไม่? ไม่มีตัวอย่างที่ชัดเจนที่ฉันสามารถหาได้ :(
เออร์เนสต์

1
@TomHarrington พร้อมข้อเสนอแนะแบบนั้นทำไมถึงมี stackoverflow ถ้าสิ่งที่เราต้องทำคือตรวจสอบเอกสาร :(
Ernest

15

ด้วย iOS 13 Apple ประกาศคุณสมบัติใหม่ใน Core Data เพื่อให้ทำงานร่วมกับ CloudKit ได้ดีขึ้น ส่วนเพิ่มเติมหลักคือNSPersistentCloudKitContainerซึ่งโดยทั่วไปจะจัดการการซิงค์ระหว่าง Core Data และ CloudKit ให้คุณ

คุณสามารถเรียนรู้เพิ่มเติมในเซสชัน WWDC โดยใช้ Core Data กับ CloudKitCloudKit

แอปเปิ้ลยังเปิดตัวคอลเลกชันที่ดีของเอกสารสำหรับการใช้งานอย่างนี้: มิเรอร์เป็นร้านค้าหลักของข้อมูลด้วย CloudKit

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.