如何将数据从数组查询传递到视图文件?

How do I pass data from an array query to a view file?

你好!

由于我的上一个问题描述不当而且不是真正的问题,我决定重新标记我的问题。

我的问题是什么?

将数组从我的 Firestore 数据库传递到我的模型文件中的视图文件的最佳方法是什么?我的方法是否正确?

我目前的做法

基本上三个文件用于创建输出。我使用的代码来自另一个有效的函数,尽管它是一个不同的查询。

  1. Friends_Requests.swift(查看文件)
import SwiftUI
import Firebase
import FirebaseFirestore

struct Friends_Requests: View {
    @State var goBack: Bool = false
    @ObservedObject var friends_model = Friends_Model()

    
    var body: some View {
        if !goBack {
            VStack {
                
                Group{
                    Text("Your Friend Requests")
                        .font(.title)
                        .fontWeight(.bold)
                    Divider()
                }
                
                Spacer()
                List (friends_model.friend_requests) { item in
                    Text(item)
                }
                .refreshable{
                    friends_model.getFriendRequestData()
                    
                }
                .listStyle(.plain)
                
                
                Spacer()
                
                Group {
                    HStack{
                        Text("Friends requests will appear here")
                    }
                }
                
                
                Group {
                    Divider()
                    HStack {
                        Button(action: {
                            withAnimation {
                                self.goBack.toggle()
                            }
                        }) {
                            Image(systemName: "arrow.left.circle.fill")
                                .resizable()
                                .frame(width: 40, height: 40)
                        }
                        .padding(.leading, 20)
                        Spacer()
                    }
                }
            }
        } else if goBack {
            FriendsPanel()
        }
    }

struct Friends_Requests_Previews: PreviewProvider {
    static var previews: some View {
        Friends_Requests()
    }
}
}
  1. Friends_Model.swift(查看模型)
import Foundation
import Firebase
import FirebaseFirestore
import SwiftUI


class Friends_Model: ObservableObject {
 
    @Published var friend_requests = [Friends_Requests_Data]()

    
    
    func getFriendRequestData() {
        let db = Firestore.firestore()
        
        let user = Auth.auth().currentUser
        let email = user?.email ?? "error: email"
        
        let queryRef = db.collection("users").document(email)
        
        queryRef.getDocument { snapshot, error in
            
            //check for errors
            if error == nil {
                print("no errors")
                
                if let snapshot = snapshot {
                    
                                
                    self.friend_requests = snapshot.get("friendRequests") { d in
                        
                            //Create friend item for each document
                            return Friends_Requests_Data(id: d.documentID,
                                                email: d["friendRequests"] as? String ?? "")
                    }
                                
            } else {
                // handle error
            }
            
        }
        
        
    }
}
  1. Friends_Requests_Data.swift(数据模型)
import Foundation

struct Friends_Requests_Data: Identifiable {
    var id: String
    var email: String
}

我遇到了什么错误?

我做到了!

感谢上述用户的帮助,我设法让整个事情顺利进行。

我将我的视图模型功能更改为如下所示 (Friends_Model.swift):

func getFriendRequestData() {
        let db = Firestore.firestore()
        
        let user = Auth.auth().currentUser
      
        let email = user?.email ?? "error: email"
        
        let queryRef = db.collection("users").whereField("friendRequests", arrayContains: email)
        
        queryRef.getDocuments { snapshot, error in
            
            //check for errors
            if error == nil {
                print("no errors")
                
                if let snapshot = snapshot {
                    
                    //Update the list property in main thread
                    //DispatchQueue.main.async {
                        //get all docs and create friend list
                        
                            self.friend_requests = snapshot.documents.map { d in
                                    //Create friend item for each document
                                return Friends_Requests_Data(id: d.documentID,
                                                        friendRequests: d["email"] as? String ?? "")
                                
                            }
                    //}
                }
                
            } else {
                // handle error
            }
            
        }
        
        
    }

我也修改了这个 (Friends_Requests.swift):

  • 添加了调用函数的init
init() {
        friends_model.getFriendRequestData()
}
  • 已更改 (旧)
    List (friends_model.friend_requests) { item in
                        Text(item)
    }

(新)


    List (friends_model.friend_requests) { item in
                        Text(item.friendRequests)
    }