Инициализация стека
Стек Core Data состоит из трех частей:
1) файла модели данных, который мы только что создали. Он хранит опи
-
сание сущности;
2) контейнера хранилища, связывающего приложение с самим хранили
-
щем. В качестве хранилища мы будем использовать базу данных SQLite,
но вообще хранилищем может быть XML-файл или хранилище в памяти;
3) контекста управляемого объекта – своего рода «кеша», в котором хранят
-
ся все экземпляры
BookManaged
Object
, пока они активны; они в точности
соответствуют объектам, хранимым в базе данных.
Мы выполнили пункт 1, создав файл модели данных
LibraryModel.xcdatamod-
el
. Но нам еще нужно выполнить пункты 2 и 3. Обычно инициализацию стека
Core Data выполняют на запуске приложения. Для простоты мы заключим все
необходимое в объект
DataController
.
В Xcode создайте новый файл Swift с именем
DataController
и добавьте его
в проект. Введите в него следующий код:
import Foundation
import CoreData
class DataController {
var persistentContainer: NSPersistentContainer
init(completion: @escaping () > ()) {
persistentContainer = NSPersistentContainer(name: "LibraryModel")
persistentContainer.loadPersistentStores { (description, error) in
if let error = error {
fatalError("Core Data stack could not be loaded. \(error)")
}
// Вызывается после инициализации стека Core Data
DispatchQueue.main.async {
completion()
}
}
}
}
Рассмотрим поближе, что здесь происходит. Во-первых, в методе
init(comp
letion:)
класса
DataController
мы инициализировали обработчик завершения.
Этот обработчик будет вызван после настройки Core Data и позволит продол
-
жить запуск приложения.
334
Сохранность данных
Хранилище будет загружаться последовательно в любом потоке, выполнившем
вызов. Мы можем загрузить хранилище асинхронно, добавив в
description
свой
-
ство
shouldAddStoreAsynchronously
со значением
true
. Однако в этом примере мы
не используем эту возможность, чтобы упростить загрузку стека Core Data.
Внутри инициализатора мы сначала присваиваем переменной экземпляра
persistentContainer
ссылку на новый экземпляр
NSPersistentContainer
. Этот кон
-
тейнер выполняет большую часть настроек и связывает файл модели данных
с координатором хранилища. Для этого мы передаем его конструктору имя
файла модели данных без расширения. После создания объекта
NSPersistent
Container
мы вызываем его метод
loadPersistentStores(_:)
и передаем ему за
-
мыкание, выполняющее проверку ошибок. Если база данных недоступна, файл
модели не может быть прочитан или возникла какая-то другая ошибка, мы вы
-
зываем
fatalError
, чтобы завершить приложение. Если же хранилище было за
-
гружено правильно, мы вызываем
completion()
– замыкание, которое передали
в вызов инициализатора
DataController
.
Теперь хранилище настроено, и в процессе его настройки мы настроили
контекст управляемого объекта, доступный как свойство контейнера. Позже
мы подробнее расскажем, как его использовать, а пока закончим настройку
стека и используем только что созданный объект
DataController
.
Откройте файл
AppDelegate.swift
. Добавьте новое свойство
dataController
с типом
DataController!
. Вставьте в метод
application(_:didFinishLaunchingWithOpt
ions:)
следующие строки перед инструкцией
return
true
в самом конце:
// Инициализировать стек Core Data
dataController = DataController() {
// Точка переопределения для обновления пользовательского
// интерфейса после завершения инициализации
}
Теперь класс
AppDelegate
должен выглядеть так:
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var dataController: DataController!
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions:
[UIApplication.LaunchOptionsKey: Any]?) > Bool {
// Инициализировать стек Core Data
dataController = DataController() {
print("Core Data stack has been initialized.")
}
return true
}
...
}
Если теперь собрать и запустить приложение, вы увидите в консоли Xcode
сообщение: «Core Data stack has been initialized».
Запись книг в хранилище
335
Да! Наш стек Core Data запущен и работает, однако в данный момент он ни
-
чем не управляет. Все данные до сих пор извлекаются из
catalog.json
. Давайте
переключим наш
ListDataSource
с использования JSON-файла на Core Data.
Do'stlaringiz bilan baham: |