Моя база данных Firebase в реальном времени имеет следующую структуру:
{
"friends" : {
"-LhZw8ryHbE-VIeh1kx6" : {
"members" : [ "3rTK12GBEQf8WMbLEdAz4Pftkxs1", "guHd7whcqyfFjfkduPoCmryLe0I3" ],
"title" : "Ansh’s Trials"
},
"-LhdBeCVRfDVQBtoAeuf" : {
"members" : [ "3rTK12GBEQf8WMbLEdAz4Pftkxs1", "guHd7whcqyfFjfkduPoCmryLe0I3" ],
"title" : "Trial 2"
},
},
"users" : {
"3rTK12GBEQf8WMbLEdAz4Pftkxs1" : {
"email" : "anshgodha77@gmail.com",
"fullname" : "Ansh Godha",
"provider" : "Firebase"
},
"guHd7whcqyfFjfkduPoCmryLe0I3" : {
"email" : "harvey@davidson.com",
"fullname" : "Harvey Davidson",
"provider" : "Firebase"
}
}
}
Теперь, в приложении, я создаю группы пользователей, и каждая группа добавляется в базу данных «друзья», как вы можете видеть. Я пытаюсь получить все группы в табличном представлении. В этом табличном представлении я установил заголовок группы в качестве значения «заголовок» для соответствующей группы в поддереве «друзья». Учитывая ключ группы, установка заголовка проста. Тем не менее, похоже, что у меня проблемы с получением имен людей из группы. Обратите внимание, что для сохранения группы в моей модели я храню UID пользователей в этой конкретной группе (см. Дерево JSON). Вот как я пытаюсь это сделать (см. Указатели ниже для получения дополнительной информации о коде):
func getUserFullname(forUID uid: String, handler: @escaping (_ username: String) -> ()) {
print(5)
self.REF_USERS.observeSingleEvent(of: .value) { (userSnapshot) in
print(6)
guard let userSnapshot = userSnapshot.children.allObjects as? [DataSnapshot] else { return }
print(7)
for user in userSnapshot {
print(8)
if user.key == uid {
handler(user.childSnapshot(forPath: "fullname").value as! String)
}
}
}
}
func getFullnameList(fromUIDArray uidarr: [String], completion: @escaping (_ nameArr: [String]) -> ()){
var namearr = [String]()
print(1)
for uid in uidarr {
print(2)
DataService.instance.getUserFullname(forUID: uid) { (returnedFullName) in
namearr.append(returnedFullName)
}
print(3)
}
print(4)
completion(namearr)
}
- REF_USERS был определен как
Database.database().reference().child("users")
DataService
- это синглтон, в котором были определены эти 2 метода.
- Я знаю, что логика моего кода верна, потому что когда я печатаю результаты, я вижу правильные имена. Просто я вижу имена после того, как все остальные части кода закончили выполняться. По сути,
nameArr
является пустым массивом даже в конце второго метода.
Итак, как мне сделать так, чтобы userFullNames были правильно переданы nameArr
? Я попытался сослаться на все другие сообщения SO, и все они, похоже, использовали обработчик завершения таким образом. Спасибо!
PS: я чрезвычайно новичок в Swift и IOS AppDev, поэтому извините, если это все еще очень распространенный вопрос! Но я пытался реализовать разные вещи, которые я нашел в Интернете (например, DispatchQueues), но не смог добиться успеха :(. Кроме того, это одна из моих первых публикаций в StackOverflow, поэтому я извиняюсь, если не хватает подробностей. Будет публиковать дополнительную информацию, необходимую!