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

В начале Лекции 10 в догонку темы Table View и предыдущей Лекции 9, профессор показывает очень интересный способ работы с Refresh Control для добавления «свежих» твитов в отдельные секции таблицы. Кроме того предлагается сделать запрос к Twitter более безопасным и c фильтром на ретвиты:
 Twitter.Request(search: «\(query) -filter:safe -filter:retweets»,count: 100)
Остальная и большая часть Лекции 10 целиком теоретическая и посвящена одной единственной теме — Core Data. По существу, это способ создания графа объектов, который проектируется на SQL или XML базы данных  или даже на базу данных в памяти.
В iOS 10 Apple представила одну из самых значительных модернизаций Core Data со времен iOS 5. Во главе нового Core Data теперь стоит класс NSPersistenceContainer.  Он снабжает вас очень простым  API: контекстом viewContext, работающим на main queue, и методом  performBackgroundTask(_:) , для выполнения Core Data задач в фоновом (background) режиме.

Создание базы данных начинается с построения визуальной схемы базы данных (Data Model) с помощью инструментов  Xcode. Это своего рода “мостик” между объектно-ориентированной “территорией” и “территорией” баз данных. Профессор демонстрирует это для простейшей задачи с двумя сущностями: Tweet и TwitterUser. Показано, как определяются Сущности, Атрибуты и Взаимосвязи.
На основе визуальной  схемы базы данных создаются пользовательские  subclasses класса NSManagedObject: Tweet  и TwitterUser  (или их расширения extension), которые для пользователей Core Data открывают совсем другой объектно-ориентированный способ общения с объектами базы данных в коде с помощью «точечной нотации».
Еще одна возможность Core Data, которая всячески продвигалась на WWDC 2016, связана с новой функциональностью Xcode 8 по автоматической генерации subclasses (или их расширений extension) для Сущностей Модели данных и автоматического управления ими с целью поддержания их в синхронном состоянии при изменяющейся Моделью данных Core Data. В Лекции 10 очень подробно рассказывается, когда лучше выбрать для автоматической генерации не сами subclasses класса  NSManagedObject  , а их расширения  extension, в которых генерируются не только переменные vars, соответствующие Атрибутам Сущности, но и вспомогательные методы для работы с Взаимосвязью типа «To Many».

Для того, чтобы что-то делать с базой данных, необходим экземпляр NSManagedObjectContext. В Лекции 10 показан один из способов получения экземпляра NSManagedObjectContext из шаблона проекта при включенной опции  “Use Core Data” с участием дебютанта NSPersistenceContainer.
Далее рассматривается весь набор операций с объектами типа NSManagedObjects: вставка, изменение их Атрибутов, удаление и запросы. Для создания объектов в Core Data теперь не нужно использовать неуклюжие многословные конструкции, в iOS 10 это выглядит как обычный инициализатор объекта.
В запросах особое внимание уделяется двум составляющим  —  дескрипторам сортировки NSSortDеscriptors и предикату NSPredicate. Подробно исследуется небольшой «язык» предикатов, встроенный в форматированную строку и представлены различной сложности примеры его использования.
В Лекции 10 затрагиваются вопросы производительности и faulting. Очень много внимания уделяется особенностям работы Core Data в многопоточной среде из-за того, что NSManagedObjectContext не является “многопоточно безопасным”. Но самая крутая вещь заключается в том, что у вас может быть множество NSManagedObjectContexts на одной и той же базе данных и вы можете обеспечить безопасный доступ к NSManagedObjects  в этих контекстах.

Далее в Лекции 10 следует теоретическая часть о том, как Core Data соединяется с UITableView, потому что этот “брак заключен на небесах”. Core Data — это куча объектов, большой граф объектов, а Table Views — реально хороший инструмент для обхода графа объектов. Как нам добиться их взаимодействия? В iOS есть замечательный класс  с именем NSFetchedResultsController,  этот реально крутой объект, который просто “приклеивает” запрос NSFetchRequest к Table View. Но начиная с Swift 3 запрос NSFetchRequest<NSFetchRequestResult> стал Generic, а следовательно, стал Generic и класс NSFetchResultsController<NSFetchRequestResult>. Как со всем этим разобраться и создать таблицу, работающую с результатами запроса, рассказывает профессор в завершающей части Лекции 10.

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