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 включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Стек Core Data: настройка NSPersistentContainer
  2. SwiftData @Model и ModelContext
  3. Связи и дескрипторы выборки
  4. Облегчённые миграции и синхронизация CloudKit
← Назад к Swift Academy