Swift Firebase:循环访问数据,只有在旧循环完成加载后才启动新循环

时间:2018-03-04 15:09:19

标签: swift firebase firebase-realtime-database collectionview

我遇到了麻烦,因为我以用户的形式加载了大量的数据条目(大约1000条)。现在,我获取用户userID并将带有用户数据的行插入到我的表视图中。问题是,目前我的应用程序等待,直到它完成了所有的用户ID,然后才开始插入它们。这是代码:

let group = DispatchGroup()

                for each in userIDs {

                    check(identifier: "DispatchGroup", text: "\(each) started")

                    Database.database().reference().child("user-data").child(each).observeSingleEvent(of: .value, with: { (snap) in

                        if let data = snap.value as? [String:AnyObject] {

                            if let name = data["name"] as? String, let urlToImage = data["imagePath"] as? String, let status = data["status"] as? String {

                                let newUser = User()
                                newUser.name = name
                                newUser.imagePath = urlToImage
                                newUser.status = status

                                self.usersTableView.append()

                                if let index = self.usersTableView.index(of: newUser) {
                                    self.tableView.insertItems(at: [IndexPath(row: index, section: 0)])
                                    check(identifier: "FeedLoad", text: "inserting user \(newUser.userName) at timestamp \(Date().timeIntervalSince1970)")
                                }

                                check(identifier: "DispatchGroup", text: "\(each) ended")

                                print("Reloading table view at \(Date().timeIntervalSince1970)")

                                group.leave()

                            }

                        }

                    })



                }

现在,打印出来的是:

DispatchGroup:xRDlUIBAsqeI13ykVsEx9P7okph2已开始

DispatchGroup:dFVZAQmPb0TRRD94sPR32FbYWyk1已开始

DispatchGroup:xRDlUIBAsqeI13ykVsEx9P7okph2已结束

DispatchGroup:dFVZAQmPb0TRRD94sPR32FbYWyk1已结束

但我希望它说:

DispatchGroup:xRDlUIBAsqeI13ykVsEx9P7okph2已开始

DispatchGroup:xRDlUIBAsqeI13ykVsEx9P7okph2已结束

DispatchGroup:dFVZAQmPb0TRRD94sPR32FbYWyk1已开始

DispatchGroup:dFVZAQmPb0TRRD94sPR32FbYWyk1已结束

我如何实现这一目标?

1 个答案:

答案 0 :(得分:0)

有几种方法可以实现这一目标。 Firebase没有针对那种东西的完成处理程序,但你可以做的是,如果你在for循环中有少量ID,那么就像这样嵌套:

Database.database().reference().child("user-data").child(id1).observeSingleEvent(of: .value, with: { (snap) in
    Database.database().reference().child("user-data").child(id2).observeSingleEvent(of: .value, with: { (snap) in
        Database.database().reference().child("user-data").child(id3).observeSingleEvent(of: .value, with: { (snap) in

        }
    }
}

但是如果这些数据可以变化,那么实现这一目标的另一种方法是存储id和Bool的字典以检查是否完成。

var ids = ["id1" : false, "id2" : false, "id3" : false]

func getNext() {
    // If all ids == true { return }
    // if not, get the next id

    Database.database().reference().child("user-data").child(id1).observeSingleEvent(of: .value, with: { (snap) in
        ids["id1"] = true 
        getNext()
    }
}

并且也不要在每个请求中致电Database.Database().reference()。而是将其存储为变量。请查看此信息以获取更多信息:Firebase best practices