Мне нужна помощь, у меня есть следующий код, который является частью функции, которая запрашивает и возвращает snapshot
пользовательских данных из Firebase
.Я пытаюсь перебрать snapshot
, передавая его вспомогательному filterDiscoveredUserByPreferences
методу, который помогает фильтровать вход / выход, затем предполагается добавить объект в массив, чтобы он мог быть передан обратно через handler
.
Проблема в том, что мой handler
вызывается слишком рано, прежде чем цикл for
завершится со снимком, возвращенным из Firebase
.Я пытался использовать distpatchQueue
, но это не сработало.
self.getUsersAtVenueHandle = self.REF_USERS.observe(.value, with: { (snapshot) in
guard let usersSnapshot = snapshot.children.allObjects as? [DataSnapshot] else { return }
for user in usersSnapshot{
// Code here to get all values from ‘user’ snapshot the create User object
let user = User(uid: uid, dictionary: dictionary)
if user.discoverable == true && user.uid != Auth.auth().currentUser?.uid {
self.filterDiscoveredUserByPreferences(discoveredUser: user, handler: { (success) in
if success {
users.append(user)
}
})//filterDiscoveredUserByPreferences
}//end if
}//end for
//handler gets called before for loops has finished processing the entire snapshot
handler (users, true)
users.removeAll()
}, withCancel: { (error) in
print(error)
})//end Firebase call
Функция: filterDiscoveredUserByPreferences
func filterDiscoveredUserByPreferences(discoveredUser: User, handler: @escaping (Bool) -> ()){
let discoveredGender = discoveredUser.gender
let discoveredPrefs: [String : Any] = discoveredUser.discoveryPrefs
let discoveredPreferMen = discoveredPrefs["men"] as? Bool
let discoveredPreferWomen = discoveredPrefs["women"] as? Bool
var discoveredPreferredGender: String?
switch (discoveredPreferMen, discoveredPreferWomen) {
case (true, true):
discoveredPreferredGender = "both"
case (true, false):
discoveredPreferredGender = "female"
case (false, true):
discoveredPreferredGender = "male"
case (false, false):
discoveredPreferredGender = "not discoverable"
default:
break
}//end switch
getUserInfo(forUserId: (Auth.auth().currentUser?.uid)!) { (user) in
let myGender = user.gender
let myDiscoveryPrefs: [String : Any] = user.discoveryPrefs
let myPreferMen = myDiscoveryPrefs["men"] as? Bool
let myPreferWomen = myDiscoveryPrefs["women"] as? Bool
switch (myPreferWomen, myPreferMen) {
case (true, true): //both
switch myGender {
case "male":
switch(discoveredPreferredGender){
case "male":
handler(true)
case "female":
handler(false)
case "both":
handler(true)
case "not discoverable":
handler(false)
default:
break
}//end switch
case "female":
switch(discoveredPreferredGender){
case "male":
handler(false)
case "female":
handler(true)
case "both":
handler(true)
case "not discoverable":
handler(false)
default:
break
}//end switch
default:
break
}//end switch
case (true, false)://female only
if discoveredGender == "male"{
handler(false)
} else {
switch(discoveredPreferredGender){
case "male":
handler(true)
case "female":
handler(false)
case "both":
handler(true)
case "not discoverable":
handler(false)
default:
break
}//end switch
}//end else
case (false, true): //male only
if discoveredGender == "female"{
handler(false)
} else {
switch(discoveredPreferredGender){
case "male":
handler(true)
case "female":
handler(false)
case "both":
handler(true)
case "not discoverable":
handler(false)
default:
break
}//end switch
}//end else
case (false, false): //none
handler(false)
default:
break
}
}//end getLoggedinUserDetails
}//end fun
Func getUserInfo
func getUserInfo(forUserId: String, currentUserHandler: @escaping (_ currentUser: User) -> ()){
REF_USERS.child(uid).observe(.value, with: { (snapshot) in
guard let dict = snapshot.value as? [String: Any] else { return }
let user = User(uid: uid, dictionary: dict)
currentUserHandler(user)
}) { (error) in
print(error)
}
}//end func