繁体   English   中英

Firebase Firestore 使用 ID 引用获取数据然后获取引用

[英]Firebase Firestore fetching data with an ID reference then fetching the reference

在为这个问题的答案搜索了几个小时之后,我在这里找到了 1 篇类似的帖子:但是我试图复制,但我相信语言语法的差异使得它很难翻译。

在我的应用程序中,允许用户发帖,Firsestore 中的帖子结构如下所示:

在此处输入图像描述

creator是也存在于数据库中的用户的 userId。

当我的结构符合 Codable 并且它们 map 1 到 1 时,我知道如何从 Firestore 中获取内容,但我没有经历过在初始获取后必须获取嵌套数据的情况。

问题通过向我的后端查询帖子,我怎样才能同时创建住在里面的用户 object?

这是我期望创建的帖子 object:

import FirebaseFirestoreSwift

public struct Post: Codable {
    /// The school id
    @DocumentID var id: String?
    /// The name of the school
    public let content: String
    /// The user who made the post
    public var creator: AppUser?
}

我想从返回的creator字段创建appUser 我应该构建内容然后使用某种promise.then来获取用户吗? 或者我可以同时做这两件事吗?

这是我认为我应该做的

    public func fetch(for schoolId: String) -> Promise<[Post]> {
    return Promise { resolver in
        fireStore
            .collection("schools").document(schoolId)
            .collection("posts").getDocuments { (querySnapshot, err) in
                guard let documents = querySnapshot?.documents else {
                  resolver.reject(Errors.firebaseError)
                  return
                }
                
                let posts = documents.compactMap { queryDocumentSnapshot -> Post? in
                  return try? queryDocumentSnapshot.data(as: Post.self)
                }
                
                let postsWithUser: [Post] = posts.map { post in
                    //Fetch User and return an updated struct
                }
                resolver.fulfill(postsWithUser)
            }
    }
}

我解决了,基本上。 我们想让第一次获取完成。 然后我们遍历每个 post.id 并调用FetchUser() i 这是我构建的返回Promise<User>的 function

func fetchTopLevelPost(for schoolId: String) -> Promise<[Post]> {
    return Promise { resolver in
    fireStore
        .collection("schools").document(schoolId)
        .collection("posts").getDocuments { (querySnapshot, err) in
            guard let documents = querySnapshot?.documents else {
              resolver.reject(Errors.firebaseError)
              return
            }

            let posts = documents.compactMap { queryDocumentSnapshot -> Post? in
              return try? queryDocumentSnapshot.data(as: Post.self)
            }
            resolver.fulfill(posts)
        }
    }
}

func fetchPostUser(for posts: [Post]) -> Promise<[Post]> {
    let allPromise = posts.map{ FetchUser().fetch(for: $0.creatorId) }
    return Promise { resolver in
        when(fulfilled: allPromise).done { users in
            let completePost = zip(users, posts).map(post.init(completeData:))
            resolver.fulfill(completePost)
        }
        .catch { error in
            resolver.reject(Errors.firebaseError)
        }
    }
}

这是呼叫站点:

public func fetch(for schoolId: String) -> Promise<[Post]> {
    return fetchTopLevelPost(for: schoolId)
        .then { self.fetchPostUser(for: $0) }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM