所以我設法創建了一個資料庫處理程式類,它具有從 firestore 檢索用戶資料的功能:
func getArtistProfileCardData(artistName: String, completionHandler: @escaping (UserModel) -> ()){
let usersRef = db.collection("users")
usersRef.whereField("artistName", isEqualTo: artistName)
.getDocuments { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
for document in querySnapshot!.documents {
print("\(document.documentID) => \(document.data())")
do {
let userData = try document.data(as: UserModel.self)
completionHandler(userData)
// printing retData.artistName gives me correct output.
} catch _ {
print("Error getting document from querySnapshot.")
}
}
}
}
}
我最近學習了如何使用完成處理程式從 DBHandler 方法中回傳這些資料。但是,我該如何將它用于我的 SwiftUI 視圖?資料現在仍在閉包中,如下所示:
struct ArtistProfileCard: View {
@State var user: UserModel
let dbhandler = DBHandler()
dbhandler.getArtistProfileCardData(artistName: "something") { userData in
// stuff to do with userDAta
}
var body: some View {
VStack(alignment: .leading) {
Spacer()
Text(user.artistName ?? "??")
.font(.title)
.bold()
.textCase(.uppercase)
Text(user.occupation)
Text("\(user.followers) Followers")
}
// and the code continues like for any typical UI view...
而且我不知道如何將其提取出來放在我的視圖中。我是否會錯誤地處理我的資料庫?我應該完全改變我的應用程式中的資料庫管理方法嗎?
這是我嘗試運行上述代碼時引發的一些錯誤

uj5u.com熱心網友回復:
這是 SwiftUI。您不需要完成處理程式。
宣告DBHandler為符合的類和ObservableObject屬性。userData@Published
旁注:通過向示例資料userData添加靜態屬性應該是非可選的。UserModel你還應該處理錯誤
class DBHandler : ObservableObject {
@Published var userData: UserModel?
// better: @Published var userData = UserModel.example
init() {
getArtistProfileCardData(artistName: "something")
}
func getArtistProfileCardData(artistName: String){
let usersRef = db.collection("users")
usersRef.whereField("artistName", isEqualTo: artistName)
.getDocuments { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
for document in querySnapshot!.documents {
print("\(document.documentID) => \(document.data())")
do {
let userData = try document.data(as: UserModel.self)
DispatchQueue.main.async {
self.userData = userData
}
} catch {
print("Error getting document from querySnapshot.", error)
}
}
}
}
}
}
并在視圖中創建一個實體DBHandler為@StateObject
struct ArtistProfileCard: View {
@StateObject var dbhandler = DBHandler()
var body: some View {
VStack(alignment: .leading) {
if let user = dbhandler.userData {
Spacer()
Text(user.artistName ?? "??")
.font(.title)
.bold()
.textCase(.uppercase)
Text(user.occupation)
Text("\(user.followers) Followers")
} else {
EmptyView()
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/492832.html
