Создайте непрерывный поток информации из Core Data в ваш пользовательский интерфейс
Некоторые из наиболее распространенных вариантов использования многих приложений для iOS - это отображение объектов, хранящихся в Core Data. Есть много решений этой проблемы, и некоторые действительно неплохие. Однако я предпочел бы использовать функциональный подход для решения этой проблемы.
Обычно мы хотим обновить наш пользовательский интерфейс:
- При изменении элемента базы данных.
- Когда мы добавляем новые элементы в базу данных.
- Когда мы удаляем элементы из базы данных.
Apple предоставляет нам NSFetchedResultsController, который неплохо справляется со своей работой. Но это действительно показывает свой возраст.
В идеале я хотел бы иметь наблюдаемый объект, который дает мне текущие сохраненные объекты и отправляет новые значения при любом обновлении.
Решение
Свое решение этой проблемы я назвал CDObservable
.
class CDObservable<T>: ObservableType where T: NSManagedObject
Представим, что у нас есть сущность Core Data с именем Customer
:
Мы инициализируем наш CDObservable
с помощью FetchRequest
и NSManagedObjectContext
и будем использовать BehaviorSubject
для отправки значений всем подписчикам.
Код работает следующим образом:
- Когда первый наблюдатель подписывается на этот наблюдаемый объект, создается
NSFetchedResultsController
, и каждый результат, который он дает, будет отправлен этому наблюдателю. - Если другой наблюдатель подписывается, он будет использовать тот же
NSFetchedResultsController
для получения результатов. - Когда все наблюдатели отказываются от подписки,
NSFetchResultController
освобождается.
Что делать отсюда
- Используйте
RxDataSources
, чтобы заполнитьtableView
:
- Используйте другой источник данных, чтобы обновить
tableView
:
- Вы также можете обновить свой
tableView
, используя традиционныйreload()
подход, но я бы не рекомендовал его.
У меня есть аналогичное решение с Swift Combine, но это для другой части. Удачного кодирования.