# #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.