Лекция 13. «Издатель» Publisher. Ещё о «постоянном хранении». Cs193P Весна 2021г.

Это Лекция 13 курса Stanford CS193p, весна 2021 года. Лекция 13 посвящена 3-м темам:
  • “издатель” Publisher
  •  “постоянное хранения” (persistence) в «облаке» CloudKit
  • “постоянное хранение” (persistence) в локальной базе данных CoreData.
Две бонусные лекции (Enroute) с демонстрацией CoreData были прочитаны весной 2020 года, а не весной 2021 года. Изложенный материал (Picker, использование Codable для извлечения данных из REST API и CoreData) по-прежнему актуален (по крайней мере, на весну 2021 года), поэтому эти лекции также включены сюда. Ссылки представлены в конце этого поста.

“Издатель” Publisher

Первая тема — это “издатели” Publisher, своего рода API, некоторый формализм, для потоковой информации, которая порождается одной частью вашей программы, a потребляется — другой. “Издатель” Publisher — это лишь один из «игроков» реактивного Swift фреймворка Combine, который оперирует такими абстрактными понятиями, как «издатели» Publishers, «подписчики» Subscribers и операторы Operators. Благодаря тому, что Apple предоставляет разработчикам уже готовых «издателей», «подписчиков» и операторов, код, написанный с помощью Combine, оказывается очень компактным и хорошо читаемым. Однако изучение самого фреймворка Combine на первых порах может показаться не таким уж простым. Поэтому введение в фреймворка Combine, которое профессор Хэгерти сначала представляет теоретически на слайдах, а потом демонстрирует  на примере выборки из интернета фонового изображения для EmojiArt документа, очень ценно. Он показывает, как использование “издателя” Publisher позволяет получить фантастически лаконичный, элегантный и  практически читаемый на английском языке код по сравнению с нашим прежнем кодом на GCD (Grand Central Dispatch). Combine — это фреймворк, на который без сомнения стоит потратить силы и изучить его, тогда вы сможете писать фантастический и элегантный код. Это действительно крутая система, если вы сможете освоить её. Чем больше вы будете овладевать Combine, тем лучше будет ваш код и тем больше вы будете повышать свою квалификацию как разработчик. Там огромный спектр возможностей, и вы можете выбрать направление, в котором вы хотите продвинуться в зависимости от располагаемого вами времени. Но в долгосрочной перспективе вы определенно захотите освоить фреймворк Combine.

“Постоянное хранения”  в «облаке» CloudKit

Cloud Kit. Запоминание данных в базе данных, расположенной в «облаке» (то есть в интернете), которая работает полностью асинхронно. Следовательно, данные появляются на любых устройствах пользователя. Это очень простая в использовании база данных, у нее есть основные операции базы данных, но не такие полноценные как у Core Data, однако она отлично работает с Core Data (так что ваши данные в Core Data могут также появиться на всех устройствах) Профессор показывает все этапы работы с «облачной» базой данных в Cloud Kit — её «включение», создание Записей, изменение их Полей, Выборка Записей, Постоянные Запросы (Standing Queries) c подпиской (Subscription) и уведомлениями Push NotificationsК сожалению, работа с Cloud Kit на Лекции 13 рассматривается только на слайдах, но есть хорошая документация о том, как это можно сделать.

“Постоянное хранения”  в локальной базе данных CoreData

В начале профессор рассматривает теоретические основы Core Data и вопросы её интеграции в SwiftUI. И, надо отдать должное Apple, она решает проблему взаимодействия столь разных Миров как Core Data и SwiftUI фантастически элегантным способом. Есть две основные точки интеграции SwiftUI с базой данных Core Data. Одна из этих точек — @ObservedObject. Объекты, которые мы создаем в базе данных, являются @ObservableObject. По существу, это миниатюрные ViewModel,  которые мы можем использовать для индивидуальных объектов  наподобие Flight, Airline на случай, если они изменились, так как мы посылаем objectWillChange.send() при их изменении.  Но iOS 14 и SwiftUI 2.0 пошли ещё дальше — они сделали объекты Core Data Identifiable, что позволяет использовать их без каких-либо затруднений в таких SwiftUI конструкциях, как ForEcEach и List. Второй точкой интеграции SwiftUI и Core Data является @FetchRequest, который динамически всегда показывает то, что находится в базе данных, это действительно “сердце” интеграции SwiftUI и Core. Это маленький «шедевр», изобретенный Apple для работы своей эффективной базой данных Core Data с декларативным SwiftUIЭто НЕ одноразовая выборка данных, когда выбрал и получил определенный результат. @FetchRequest постоянно выполняет выборку, так что ваш UI всегда будет показывать то, что в данный момент находится в базе данных.  Всё это часть декларативной “природы” SwiftUI. Работа c Core Data в SwiftUI невероятно комфортна, но «вишенкой на торте» является возможность зеркально отображать на iCloud все то, что вы размещаете в базе данных Core Data. В этом случае пользователь увидит все ваши данные в Core Data на любых устройствах. Эта потрясающая возможность появилась в iOS 13. Пол Хэгерти её не демонстрирует, но настроить её несложно  К сожалению, работа с CoreData на Лекции 13 данного курса рассматривается только на слайдах, но профессор отсылает нас к прошлогоднему курсу CS193P 2020, где на Лекции 12 он представляет большой демонстрационный пример, цель которого состоит в использовании базы данных CoreData в приложении Enroute для хранения всей информации, поступающей от трекера полетов FlightAware, и построении полноценного UI исключительно на просмотре базы данных CoreData.

В связи с этим на этом курсе предоставляются две БОНУСНЫЕ ЛЕКЦИИ (доступ к русскоязычным конспектам бесплатно).

 Две бонусные лекции (Enroute) были прочитаны весной 2020 года, а не весной 2021 года. Изложенный материал (Picker, использование Codable для извлечения данных из REST API и CoreData) по-прежнему актуален (по крайней мере, на весну 2021 года), поэтому эти лекции также включены сюда. Обновленный демонстрационный код (до Xcode 12) также включен (единственное существенное изменение — использование новой архитектуры приложения SwiftUI, то есть EnrouteApp.swift вместо SceneDelegate.swift и др.).

2020 Enroute Part 1.

Enroute Picker Codable REST API

Первая из двух бонусных лекций 2020 года посвящена Picker и создает новое демонстрационное приложение (Enroute), которое извлекает данные из REST API в Интернете с помощью механизма Codable, показанного ранее в курсе. Смотреть в YouTube Демо (как показано на Лекции). Демо (обновлено для Xcode 12). Русскоязычный иллюстрированный конспект Лекции Enroute Part 1 (бесплатно).

2020 Enroute Part 2.

Core Data

Вторая из двух лекций 2020 года, в которых используется демонстрационное приложение Enroute. Добавляется база данных CoreData в Enroute для хранения исторических данных о рейсах. Смотреть в YouTube Демо (как показано на Лекции). Демо (обновлено для Xcode 12). Русскоязычный иллюстрированный конспект Лекции Enroute Part 2 (бесплатно). Русскоязычный неавторизованный конспект полной Лекции 13, иллюстрированный, хронометрированный и представленный в виде PDF-файла, который можно скачать и использовать offline, а также в формате Google Doc доступны на платной основе.