tableView Firebase Swift中的异步数据

时间:2017-07-08 09:10:20

标签: ios swift firebase

我对Firebase中最不喜欢的部分有疑问。我想从用户的以下列表中提取帖子(每个用户只有一个帖子)。首先,我创建了一个完成处理程序,以获取Firebase中所有关注者的列表,并将其存储在userArray字符串数组中:

func GetUsersInFollowing(completion: @escaping (Bool) -> ()) {
    ref.child("following").queryOrdered(byChild: FIRAuth.auth()!.currentUser!.uid).observeSingleEvent(of: .value, with: { (snapshot) in
        for group in snapshot.children {
            self.userArray.append((group as AnyObject).key)
        }
        completion(true)
    })
}

现在的计划是从userArray的每个元素中提取一个帖子。 这是问题的起点。我在GetUsersInFollowing()完成后立即调用CreatePosts()。

func CreatePosts() {
    for x in userArray {
        var thePost = Post()
        print("1")
        self.ref.child("users").child(x).observeSingleEvent(of: .value, with: { (snapshot) in
            let value = snapshot.value as? NSDictionary
            thePost.fullName = value?["fullname"] as? String ?? ""
            thePost.username = value?["username"] as? String ?? ""
            thePost.profileImageURL = value?["photourl"] as? String ?? ""
            print("2")
        })

        self.ref.child("posts").child(x).observeSingleEvent(of: .value, with: { (snapshot) in
            let value = snapshot.value as? NSDictionary
            thePost.description = value?["description"] as? String ?? ""
            thePost.info = value?["location"] as? String ?? ""
            thePost.postImageURL = value?["photoURL"] as? String ?? ""
            thePost.timePost = value?["timestamp"] as? NSDate
            thePost.upVotes = value?["upvotes"] as? Int ?? 0
        })

        self.postArray.append(thePost)
        self.tableView.reloadData()
    }
}

一切看起来都不错,但肯定不是。以下是我创建单元格的方法:

func configureCell(post: Post) {
    self.post = post
    self.username.text = post.username
    self.profileImage = post.profileImageURL
    print("3")
    self.fullname.text = post.fullName
    self.timestamp.text = post.timePost
    self.upvotes.text = post.upVotes
    self.location.text = post.location
    self.descriptionText.text = post.description
}

控制台中的输出有所不同,但通常我得到: 1 1 3 3 2 2

我们的想法是首先从Firebase检索所有数据,将其添加到post对象,将对象附加到数组,然后使用下载的数据为该对象创建单元格。即使未检索到数据,也已创建单元格。我认为这就是问题所在。谢谢,每一个建议都表示赞赏。

1 个答案:

答案 0 :(得分:1)

您需要内部查询来合并用户个人资料数据和发布数据。 像这样 -

    func CreatePosts() {

        //Using userPostArrayObjFetched as a counter to check the number of data fetched.
        //Remove this code, if you don't want to wait till all the user data is fetched.
        var userPostArrayObjFetched = 0

        for (index,userID) in userArray.enumerated() {

            print("1" + userID)

            self.ref.child("users").child(userID).observeSingleEvent(of: .value, with: { (snapshot) in

                var thePost = Post()

                let value = snapshot.value as? NSDictionary
                thePost.fullName = value?["fullname"] as? String ?? ""
                thePost.username = value?["username"] as? String ?? ""
                thePost.profileImageURL = value?["photourl"] as? String ?? ""
                print("2" + userID)

                self.ref.child("posts").child(userID).observeSingleEvent(of: .value, with: { (snapshot) in
                    let value = snapshot.value as? NSDictionary
                    thePost.description = value?["description"] as? String ?? ""
                    thePost.info = value?["location"] as? String ?? ""
                    thePost.postImageURL = value?["photoURL"] as? String ?? ""
                    thePost.timePost = value?["timestamp"] as? NSDate
                    thePost.upVotes = value?["upvotes"] as? Int ?? 0
                    print("3" + userID)

                    self.postArray.append(thePost)

//                      Uncomment if you want to reload data as fetched from Firebase without waiting for all the data to be fetched.
//                    self.tableView.reloadData()

                    userPostArrayObjFetched += 1

                    if userPostArrayObjFetched == userArray.count{
                         self.tableView.reloadData()
                    }
                })
            })
        }
    }