代码之家  ›  专栏  ›  技术社区  ›  Jonas

Swift Firebase:循环数据,仅当旧循环已完成加载时才启动新循环

  •  0
  • Jonas  · 技术社区  · 6 年前

    我遇到了麻烦,因为我以用户的形式加载了大量数据条目(大约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()
    
                                }
    
                            }
    
                        })
    
    
    
                    }
    

    现在,把我打印出来的是:

    调度组:xRDlUIBAsqeI13ykVsEx9P7okph2已启动

    调度组:DFVZAQMPB0TRD94SPR32FBYWYK1已启动

    调度组:xRDlUIBAsqeI13ykVsEx9P7okph2结束

    调度组:DFVZAQMPB0TRD94SPR32FBYWYK1结束

    但我想说:

    调度组:xRDlUIBAsqeI13ykVsEx9P7okph2已启动

    调度组:xRDlUIBAsqeI13ykVsEx9P7okph2结束

    调度组:DFVZAQMPB0TRD94SPR32FBYWYK1已启动

    调度组:DFVZAQMPB0TRD94SPR32FBYWYK1结束

    我如何做到这一点?

    1 回复  |  直到 6 年前
        1
  •  0
  •   HelloimDarius    6 年前

    有几种方法可以实现这一点。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
    
            }
        }
    }
    

    但是,如果数据可以变化,实现这一点的另一种方法是存储一个ids和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