Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift Firebase查询不是';如果我不能按我想要的顺序开火,我怎么才能解决这个问题?_Swift_Xcode_Firebase - Fatal编程技术网

Swift Firebase查询不是';如果我不能按我想要的顺序开火,我怎么才能解决这个问题?

Swift Firebase查询不是';如果我不能按我想要的顺序开火,我怎么才能解决这个问题?,swift,xcode,firebase,Swift,Xcode,Firebase,在我的iOS应用程序中,我试图从Google Firebase中提取字符串来填充数组friends,然后在该数组上迭代以使用标记填充friendsMarkers。我的问题是fetchFriendsMarkers中的for循环永远不会执行,因为friends[]返回一个空数组。这是一个同步问题吗?如果是这样,在执行fetchFriendsMarkers()之前,如何确保friends不为空 var ref: DatabaseReference? var friends: [Stri

在我的iOS应用程序中,我试图从Google Firebase中提取字符串来填充数组friends,然后在该数组上迭代以使用标记填充friendsMarkers。我的问题是fetchFriendsMarkers中的for循环永远不会执行,因为friends[]返回一个空数组。这是一个同步问题吗?如果是这样,在执行fetchFriendsMarkers()之前,如何确保friends不为空

    var ref: DatabaseReference?
    var friends: [String] = []
    var friendsMarkers: [Marker] = []

    private func viewDidLoad(){
            ref = Database.database().reference()
            fetchFriends()
            fetchFriendsMarkers()
    }   

    private func fetchFriends(){
            let query = ref?.child("users").child((currentUser?.uid)!).child("Friends")
            query?.observe(.childAdded, with: { (snapshot) in
                let friend = snapshot.value as? NSDictionary
                let id = friend!["id"] as! String
                self.friends.append(id)
            })
            query?.observe(.childRemoved, with: { (snapshot) in
                let friend = snapshot.value as? NSDictionary
                let id = friend!["id"] as! String
                var index: Int
                for i in self.friends{
                    if i == id{
                        index = self.friends.index(of: i)!
                        self.friends.remove(at: index)
                    }
                }
            })
        }

        private func fetchFriendsMarkers(){
            for friend in self.friends {
                let query1 = ref?.child("user-locations").child(friend)
                query1?.observe(.childAdded, with: { (snapshot) in

                })
                query1?.observe(.childChanged, with: { (snapshot) in

                })
                query1?.observe(.childRemoved, with: { (snapshot) in

                })
            }
        }

这些都是异步调用,这就是为什么没有调用其他函数的原因。收到数据时,需要在fetchFriends函数中调用fetchFriends标记,并建议进行以下修改:

private func fetchFriends(){
 let query = ref?.child("users").child((currentUser?.uid)!).child("Friends")
 query?.observe(.childAdded, with: { (snapshot) in
   let friend = snapshot.value as? NSDictionary
   let id = friend!["id"] as! String
   self.friends.append(id)
   // call fetchFriendMarkers when you receive the friend data
   self.fetchFriendsMarkers(id)
 })
 query?.observe(.childRemoved, with: { (snapshot) in
   let friend = snapshot.value as? NSDictionary
   let id = friend!["id"] as! String
   var index: Int
   for i in self.friends{
      if i == id{
         index = self.friends.index(of: i)!
         self.friends.remove(at: index)
      }
   }
 })
}

private func fetchFriendsMarkers(friend: String){
  let query1 = ref?.child("user-locations").child(friend)
     query1?.observe(.childAdded, with: { (snapshot) in

  })
  query1?.observe(.childChanged, with: { (snapshot) in

  })
  query1?.observe(.childRemoved, with: { (snapshot) in  
  })

}

...
fetchFriends()

别担心。如果我的答案对你有帮助,请投票并将其标记为已接受答案。谢谢