Данные представления сборщика исчезают слишком быстро

#swiftui #picker #combine

#swiftui #сборщик #объединить

Вопрос:

Сценарий:

  1. Приложение основано на вкладках; одна вкладка представляет собой представление контейнера, имеющее «Представление сборщика (данных)».
  2. Представление сборщика: сборщик изначально загружается с данными через @State -> @Binder.
  3. Представление «Главная страница» (приветствие) изначально отображается поверх представления сборщика в ZStack{}.
  4. Пользователь подтверждает, что первая страница исчезает, чтобы открыть представление сборщика (# 2).

Примечание: сборщик получает данные при проверке отладки.
В скрытом окне выбора отображаются исходные данные.

Проблема:Открытое представление сборщика становится пустым; после отклонения главной страницы / представления.

Ниже приведен список отладки через точку останова данных:

введите описание изображения здесь

Наблюдение:
Я хочу получить доступ к источнику данных как можно скорее, чтобы заполнить представление сборщика, чтобы пользователь не ждал данных. Следовательно, данные сначала доступны до открытия представления сборщика.

Однако представление сборщика, по-видимому, повторно отображается непосредственно перед отображением.

Примечание: я вижу заполненную страницу выбора, если я закомментирую код первой страницы.

👉 Я добавил логический фильтр, чтобы избежать вызова сборщика с пустой полезной нагрузкой данных.

Вопрос:

Как мне сделать данные более постоянными; то есть оставаться до тех пор, пока они не будут удалены?

Должен ли я создавать конкретную копию переменной @Binding?

Комментарии:

1. Не могли бы вы предоставить воспроизводимый пример?

2. Приложение большое; я попытаюсь воссоздать его с помощью простой версии. И вернитесь.

Ответ №1:

Исправление, не связанное с SwiftUI:

Используйте синглтон для постоянного вектора данных; и, следовательно, на него не влияет срок службы управляющего представления:

 final class DataSource {
    static let shared = DataSource()
    var myVar:String = "Hello World"
    var countryNames: [String]?
}
  

введите описание изображения здесь

Это настолько просто, что это элегантно.
Тем не менее, я хотел бы использовать combine здесь, но срок службы данных слишком изменчив.

Я планирую продолжить рассмотрение этой парадигмы в своем проекте, поскольку я становлюсь более опытным в Combine.

Если у кого-либо есть метод SwiftUI / Combine для доступа, хранения / совместного использования данных, который не требует одноэлементного объекта, пожалуйста, опубликуйте.