SwiftUI открытый вид с данными или только со ссылкой на документ Firestore - PullRequest
0 голосов
/ 15 марта 2020

Мне нужно открыть представление с именем PackageDetails.

В двух случаях это представление можно открыть.

1. Если вы нажмете указанный c пакет из списка пакетов.

У меня есть массив всех пакетов. Итак, я передаю специфика c структуру из этого списка и открываю это представление пакета. PackageDetail(package: package). У меня уже есть все необходимые данные, поэтому мне не нужно делать дополнительный вызов в Firestore, чтобы получить этот документ.

2. Представление пакета можно открыть по ссылке из какого-либо другого представления в этом приложении.

В этом случае у меня нет всех деталей этого указанного c пакета, но у меня есть только ссылка на Пожарная документация. Я использую эту ссылку, чтобы сделать запрос, как только появится это представление, и получить подробную информацию об этом пакете. PackageDetail(package: packageReference)

Я делаю это путем объявления пакета как необязательного @State var package: PackageModel? и onAppear. Я проверяю, является ли Пакет нулевым или нет.

.onAppear {
    if let package = self.package {
        // package data exists
    } else {
        // fetch it from firestore
    }
}

Вопрос в том, правильно ли я делаю? Это лучший подход?

1 Ответ

1 голос
/ 15 марта 2020

Package не является состоянием просмотра, поэтому @State по конструкции здесь не подходит. Вместо этого предпочтительнее использовать представление модели шаблон, поэтому подход (неуклюжий) может быть таким, как показано ниже:

class PackageViewModel: ObservableObject {
    @Published var packageReference: URL?
    @Published var package: PackageModel?

    init(package: PackageModel? = nil, reference: URL? = nil) {
        self.package = package
        self.packageReference = reference
    }

    private func loadPackage() {
        // do load here from 'self.packageReference' and in callback assign package created from result
        DispatchQueue.main.async {
            self.package = package
        }
    }
}

struct PackageView: View {
    @ObservedObject var vm: PackageViewModel

    var body: some View {
        VStack {
            // some main part here

            if vm.package != nil {
                PackageDetail(package: self.vm.package)
            }
        }
        .onAppear {
            if self.vm.package == nil {
                self.vm.loadPackage()
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...