Извлечение данных из firebase после сохранения данных

# #swift #firebase #swiftui #fetch

Вопрос:

Первая часть приведенного ниже кода работает нормально, а это значит, что я могу хранить данные в firebase так, как захочу. Но после строки «self.showResult = true» я также хочу получить данные и сделать «self.page» равным данным. Почему-то я всегда получаю «ноль», когда печатаю «страницу». Кто-нибудь может объяснить, какую ошибку я совершаю при извлечении данных?

Это модель представления

 
import Firebase
import SwiftUI

class LoadPageViewModel: ObservableObject{
    @Published var page: Page? = Page(id: "", speakerName: "", speakerImageUrl: "", speech: "", place: "", placeImageUrl: "", action: "", index: "")
    
    let script: Script
    @Published var showResult: Bool = false
    @Published var index: Int = 0
    
    @Published var showUpdate = false
    
    init(script: Script){
        self.script = script
    }
    
    func uploadPage1(speakerName: String, image1: UIImage, speech: String, place: String, image2:UIImage, action: String){
        guard let user = AuthViewModel.shared.currentUser else {return}

        imageUploader.uploadImage(image: image1, type: .post){speakerImageUrl in
            imageUploader.uploadImage(image: image2, type: .post){placeImageUrl in
                let pageId = UUID().uuidString

                let data = [
                    "id": user.id ?? "",
                    "speakerName": speakerName,
                    "speakerImageUrl": speakerImageUrl,
                    "speech": speech,
                    "place": place,
                    "placeImageUrl": placeImageUrl,
                    "action": action,
                    "index": String(self.index)
                ]
                
                Firestore.firestore().collection("scripts").document(self.script.id ?? "").collection("page(self.index)").document(pageId).setData(data) {error in
                    if let error = error{
                        print("Error uploading script (error.localizedDescription)")
                        return
                    }
                }
                
                self.showResult = true
                
                if self.showResult{
                    Firestore.firestore().collection("scripts").document(self.script.id ?? "").collection("page(self.index)").document(pageId).getDocument { (snapshot, _) in
                        
                        self.page = try? snapshot?.data(as: Page.self)
                        
                    }
                }
            }
        }
    }
}

 

Это модель

 

import FirebaseFirestoreSwift

struct Script: Identifiable, Decodable{
    @DocumentID var id: String?
    var name: String
    var ownerUid: String
}

struct Page: Identifiable, Decodable{
    @DocumentID var id: String?
    var speakerName: String?
    var speakerImageUrl: String?
    var speech: String?
    var place: String
    var placeImageUrl: String
    var action: String
    var index: String
}

 

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

1. Вызовы Firebase похожи setData и getDocument являются асинхронными . Они не возвращаются немедленно, поэтому эффекты, которые вы видите при их запуске, не будут сразу доступны в последующих строках. Здесь есть много вопросов об асинхронных функциях в Swift (и в Firebase), о которых вы, возможно, захотите прочитать. Изучите функции обратного вызова и обработчики завершения, а также, поскольку это SwiftUI, также используйте Combine.