Создайте непрерывный поток информации из Core Data в ваш пользовательский интерфейс

Некоторые из наиболее распространенных вариантов использования многих приложений для iOS - это отображение объектов, хранящихся в Core Data. Есть много решений этой проблемы, и некоторые действительно неплохие. Однако я предпочел бы использовать функциональный подход для решения этой проблемы.

Обычно мы хотим обновить наш пользовательский интерфейс:

  • При изменении элемента базы данных.
  • Когда мы добавляем новые элементы в базу данных.
  • Когда мы удаляем элементы из базы данных.

Apple предоставляет нам NSFetchedResultsController, который неплохо справляется со своей работой. Но это действительно показывает свой возраст.

В идеале я хотел бы иметь наблюдаемый объект, который дает мне текущие сохраненные объекты и отправляет новые значения при любом обновлении.

Решение

Свое решение этой проблемы я назвал CDObservable.

class CDObservable<T>: ObservableType where T: NSManagedObject

Представим, что у нас есть сущность Core Data с именем Customer:

Мы инициализируем наш CDObservable с помощью FetchRequest и NSManagedObjectContext и будем использовать BehaviorSubject для отправки значений всем подписчикам.

Код работает следующим образом:

  1. Когда первый наблюдатель подписывается на этот наблюдаемый объект, создается NSFetchedResultsController, и каждый результат, который он дает, будет отправлен этому наблюдателю.
  2. Если другой наблюдатель подписывается, он будет использовать тот же NSFetchedResultsController для получения результатов.
  3. Когда все наблюдатели отказываются от подписки, NSFetchResultController освобождается.

Что делать отсюда

  • Используйте RxDataSources, чтобы заполнить tableView:
  • Используйте другой источник данных, чтобы обновить tableView:
  • Вы также можете обновить свой tableView, используя традиционный reload() подход, но я бы не рекомендовал его.

У меня есть аналогичное решение с Swift Combine, но это для другой части. Удачного кодирования.