0Pricing
Swift Academy · บทเรียน

การย้ายโครงสร้างแบบเบาและการซิงค์ CloudKit

ย้ายการเปลี่ยนแปลงโครงสร้างข้อมูล และเปิดใช้การซิงค์ CloudKit ด้วย NSPersistentCloudKitContainer

การย้ายโครงสร้างแบบเบาและการซิงค์ CloudKit เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงต้องย้ายข้อมูล

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

// Without migration, app crashes on launch:
// "The model used to open the store is incompatible with the one used to create the store"

การย้ายข้อมูลแบบเบาใน Core Data

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

let desc = NSPersistentStoreDescription(url: storeURL)
desc.shouldMigrateStoreAutomatically = true
desc.shouldInferMappingModelAutomatically = true
container.persistentStoreDescriptions = [desc]

ประวัติเวอร์ชันใน .xcdatamodeld

สร้างเวอร์ชันโมเดลใหม่ใน Xcode: ตัวแก้ไข → เพิ่มเวอร์ชันโมเดล จากนั้นกำหนดให้เวอร์ชันใหม่เป็นเวอร์ชันปัจจุบัน

// In MyModel.xcdatamodeld:
// ├── MyModel.xcdatamodel  (v1 - old)
// └── MyModel 2.xcdatamodel (v2 - current)
// Set current version to v2 in File Inspector

การกำหนดเวอร์ชันสคีมาใน SwiftData

ใช้ VersionedSchema และ SchemaMigrationPlan เพื่อจัดการเวอร์ชันโมเดลของ SwiftData

enum AppSchemaV1: VersionedSchema {
  static var versionIdentifier = Schema.Version(1,0,0)
  static var models: [any PersistentModel.Type] { [ItemV1.self] }
  @Model final class ItemV1 { var name: String; init(name: String) { self.name = name } }
}

SchemaMigrationPlan

กำหนดขั้นตอนการย้ายข้อมูลระหว่างเวอร์ชันใน SchemaMigrationPlan เพื่อแนะนำ SwiftData ระหว่างการอัปเกรด

enum AppMigrationPlan: SchemaMigrationPlan {
  static var schemas: [any VersionedSchema.Type] { [AppSchemaV1.self, AppSchemaV2.self] }
  static var stages: [MigrationStage] { [migrateV1toV2] }
  static let migrateV1toV2 = MigrationStage.lightweight(fromVersion: AppSchemaV1.self, toVersion: AppSchemaV2.self)
}

ขั้นตอนการย้ายข้อมูลแบบกำหนดเอง

สำหรับการย้ายข้อมูลที่ซับซ้อน เช่น การแปลงข้อมูล ให้ใช้ขั้นตอน .custom พร้อมคลอเชอร์ willMigrate และ didMigrate

static let migrateV1toV2 = MigrationStage.custom(
  fromVersion: AppSchemaV1.self,
  toVersion: AppSchemaV2.self,
  willMigrate: { context in
    // transform old data
  },
  didMigrate: nil
)

NSPersistentCloudKitContainer

แทนที่ NSPersistentContainer ด้วย NSPersistentCloudKitContainer เพื่อเปิดใช้การซิงค์กับ CloudKit

let container = NSPersistentCloudKitContainer(name: "MyModel")
container.loadPersistentStores { _, error in
  if let error { fatalError("\(error)") }
}
container.viewContext.automaticallyMergesChangesFromParent = true

ข้อกำหนดของ CloudKit

การซิงค์กับ CloudKit ต้องมีบัญชี iCloud ที่ลงชื่อเข้าใช้แล้ว สิทธิ์การใช้งาน CloudKit และคอนเทนเนอร์ CloudKit ที่กำหนดค่าไว้ในพอร์ทัลนักพัฒนา

// Xcode: Signing & Capabilities → + → iCloud → CloudKit
// Enable "Use CloudKit" in Core Data model inspector

SwiftData กับ CloudKit

ส่ง ModelConfiguration ที่มี cloudKitDatabase เพื่อเปิดใช้การซิงค์กับ CloudKit ใน SwiftData

let config = ModelConfiguration(
  schema: schema,
  cloudKitDatabase: .automatic
)
let container = try ModelContainer(for: schema, configurations: config)

การจัดการข้อขัดแย้งในการซิงค์

Core Data CloudKit แก้ไขข้อขัดแย้งด้วยนโยบายการเขียนครั้งล่าสุดชนะ ควรออกแบบโมเดลเพื่อลดการแย่งกันเขียนพร้อมกัน

// Best practice: keep models granular
// One attribute per write concern
// Avoid large blobs that frequently change

การทดสอบการย้ายข้อมูล

ทดสอบการย้ายข้อมูลกับสำเนาของที่จัดเก็บข้อมูลจริงก่อนเผยแพร่ เพื่อค้นหาปัญหาก่อนที่จะส่งผลกระทบต่อผู้ใช้

// Copy production store to a temp location
// Load it with the new container and verify objects are intact

การตรวจติดตามการย้ายข้อมูล

รับฟังการแจ้งเตือนการย้ายข้อมูลของ Core Data เพื่อแสดงส่วนติดต่อผู้ใช้รายงานความคืบหน้าระหว่างการย้ายข้อมูลที่ใช้เวลานาน

NotificationCenter.default.addObserver(
  forName: .NSPersistentStoreCoordinatorStoresWillChange,
  object: container.persistentStoreCoordinator,
  queue: .main
) { _ in showMigrationProgress() }

ตรวจสอบความเข้าใจ

คลาสย่อยใดของ NSPersistentContainer ที่เปิดใช้การซิงค์กับ CloudKit โดยอัตโนมัติ

ทบทวนบทเรียน

เปิดใช้การย้ายข้อมูลแบบเบาด้วย shouldMigrateStoreAutomatically สำหรับการเปลี่ยนแปลงง่าย ๆ ใช้ VersionedSchema ร่วมกับ SchemaMigrationPlan สำหรับ SwiftData และเปิดใช้การซิงค์กับ CloudKit โดยเปลี่ยนไปใช้ NSPersistentCloudKitContainer หรือ ModelConfiguration(cloudKitDatabase: .automatic)

คำถามที่พบบ่อย

บทเรียน “การย้ายโครงสร้างแบบเบาและการซิงค์ CloudKit” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การย้ายโครงสร้างแบบเบาและการซิงค์ CloudKit” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การย้ายโครงสร้างแบบเบาและการซิงค์ CloudKit”

ย้ายการเปลี่ยนแปลงโครงสร้างข้อมูล และเปิดใช้การซิงค์ CloudKit ด้วย NSPersistentCloudKitContainer คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การย้ายโครงสร้างแบบเบาและการซิงค์ CloudKit” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม

ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. สแตก Core Data: การตั้งค่า NSPersistentContainer
  2. SwiftData @Model และ ModelContext
  3. ความสัมพันธ์และ Fetch Descriptors
  4. การย้ายโครงสร้างแบบเบาและการซิงค์ CloudKit
← กลับไปที่ Swift Academy