Лекция 10 CS193P Spring 2016 — Core Data (Объектно-ориентированная база данных).

Screen Shot 2016-08-02 at 6.46.32 AM

Лекция 10 целиком теоретическая и посвящена одной единственной теме — Core DataПо существу, это способ создания графа объектов, который проектируется на SQL или XML базу данных  или даже на базу данных в памяти. 

Создание базы данных начинается с построения визуальной схемы базы данных (Data Model) с помощью инструментов  Xcode. Это своего рода “мостик” между объектно-ориентированной “территорией” и “территорией” баз данных. Профессор демонстрирует это для простейшей задачи с двумя сущностями: Tweet и TwitterUser. Показано, как определяются Сущности, Атрибуты и Взаимосвязи.

На основе визуальной  схемы базы данных создаются subclasses  NSManagedObject: Tweet  и  TwitterUser, которые для пользователей Core Data открывают совсем другой объектно-ориентированный способ общения с объектами базы данных в коде с помощью «точечной нотации».

Для того, чтобы что-то делать с базой данных, необходим экземпляр NSManagedObjectContextРеально существует два способа получения его, и они практически эквивалентны.

Первый способ состоит в получении экземпляра NSManagedObjectContext при создании проекта, когда нужно включить переключатель “Use Core Data”.  После создания проекта c включенной этой опцией вы обнаружите огромное количество сгенерированного специально для вас кода Core Data в AppDelegate. Один из методов в этом коде дает вам NSManagedObjectContext, который разделяется (shared) всем вашим приложением.
Второй способ  получения экземпляра NSManagedObjectContext связан с созданием UIManagedDocument, который имеет переменную var с именем managedObjectContext, которая дает вам экземпляр NSManagedObjectContext.
В лекции рассказано об обоих механизмах получения экземпляра  NSManagedObjectContext, но профессор явно отдает преимущество второму способу создания контекста с использование UIManagedDocument, отмечая его простоту и в то же время небольшую сложность, связанную с асинхронным открытием документа. Но мы уже привыкли к синхронности и чувствуем себя с ней свободно, так что это лишь небольшое усложнение для нас. Еще одно преимущество использования  UIManagedDocument, состоит в том, что он АВТОМАТИЧЕСКИ сохраняется и АВТОМАТИЧЕСКИ закрывается.  Для способа получения контекста из AppDelegate приходится явно сохранять контекст с помощью метода  save().
На примере метода save() для класса NSManagedObjectContext, который выбрасывает (throws) ошибку, профессор подробно рассказывает все синтаксические конструкции для обработки выброшенной ошибки:

блок do {try….} catch let error {…}
try!
try?

Далее рассматривается весь набор операций с объектами типа NSManagedObjects: вставка, изменение их Атрибутов, удаление и запросы. В запросах особое внимание уделяется двум составляющим  —  дескрипторам сортировки NSSortDеscriptors и предикату NSPredicate. Подробно исследуется небольшой «язык» предикатов, встроенный в форматированную строку и представлены различной сложности примеры его использования.

В Лекции 10 затрагиваются вопросы производительности и faulting. Очень много внимания уделяется особенностям работы Core Data в многопоточной среде из-за того, что NSManagedObjectContext не является “многопоточно безопасным”. Но самая крутая вещь заключается в том, что у вас может быть множество NSManagedObjectContexts на одной и той же базе данных и вы можете обеспечить безопасный доступ к NSManagedObjects  в этих контекстах.

Профессор вскользь упоминает parentContext, но не забывает сказать о хитростях его использования в UIManagedDocument.

Далее в Лекции 10 следует теоретическая часть о том, как Core Data соединяется с UITableView, потому что этот “брак заключен на небесах”. Core Data — это куча объектов, большой граф объектов, а Table Views — реально хороший инструмент для обхода графа объектов. Как нам добиться их взаимодействия? В iOS есть замечательный класс  с именем NSFetchedResultsController. Пол Хэгарти очень подробно рассказывает о тонкостях использования этого класса. В результате рождается класс с именем CoreDataTableViewController, который, с одной стороны реализует все методов UITableViewDataSource,  а с другой стороны — устанавливает себя делегатом для “отслеживания” изменений в Core Data.
Этот чрезвычайно полезный класс разработан Полом Хэгарти на Swift и предоставлен в распоряжение студентов для выполнения Домашней работы 5, одновременно он является настоящим подарком для тех, кто разрабатывает приложения с использованием Core Data и Table View.

 Лекции и слайды на английском языке представлены в iTunes название “10. Core Data”.
Русскоязычный неавторизованный конспект Лекции 10, хронометрированный через каждые 5 минут, и представленный в виде PDF-файла, который можно скачать и использовать offline, а также Google Doc доступны на платной основе.