0Pricing
Swift Academy · درس

الترحيلات الخفيفة والمزامنة مع CloudKit

رحّلوا تغييرات المخطط ومكّنوا المزامنة مع CloudKit باستخدام NSPersistentCloudKitContainer.

الترحيلات الخفيفة والمزامنة مع CloudKit درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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: Editor → Add Model Version. ثم عيّنوا الإصدار الحالي إلى الإصدار الجديد.

// 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» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.

ماذا ستتعلم في «الترحيلات الخفيفة والمزامنة مع CloudKit»؟

رحّلوا تغييرات المخطط ومكّنوا المزامنة مع CloudKit باستخدام NSPersistentCloudKitContainer. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟

لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «الترحيلات الخفيفة والمزامنة مع CloudKit»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟

نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مكدس Core Data: إعداد NSPersistentContainer
  2. ‏SwiftData @Model وModelContext
  3. العلاقات وواصفات الجلب
  4. الترحيلات الخفيفة والمزامنة مع CloudKit
← العودة إلى Swift Academy