Как мне написать вложенные экранирующие завершения для Firebase?
Я все еще пытаюсь обернуть голову, избегая замыканий, и я думаю, что у меня есть очень базовое понимание. Но сейчас я столкнулся с проблемой. У моего кода есть закрывающееся замыкание внутри другого закрывающегося замыкания, и я в тупике.
Этот вид описывает, что я хочу сделать. Вместо того, чтобы получать данные, которые повторяются с течением времени, я просто хочу поместить каждый результат в массив, к которому я могу получить доступ к данным сразу, вне блока завершения.
Я также смотрел на это, но я не мог понять, как адаптировать его для моих целей.
Вот мой код:
@IBOutlet weak var userImage: UIImageView!
@IBOutlet weak var instructionsLabel: UILabel!
var users = [User]()
func loadExistingUsers(completion: @escaping () -> ()) {
ref.child("members").observe(.childAdded) { (snapshot: FIRDataSnapshot) in
if let dict = snapshot.value as? [String : Any] {
let userPhotoUrl = dict["profileImageUrl"] as! String
let userFirstName = dict["firstName"] as! String
let userBirthday = dict["birthday"] as! Int
let userPasscode = dict["passcode"] as! Int
let userGender = dict["gender"] as! String
let isUserChildOrParent = dict["childParent"] as! String
// get user profile images
let storageRef = FIRStorage.storage().reference(forURL: userPhotoUrl)
storageRef.data(withMaxSize: 1 * 1024 * 1024, completion: { (data, error) in
let pic = UIImage(data: data!)
let user = User(profilePhoto: pic!,
userFirstName: userFirstName,
userBirthday: userBirthday,
userPasscode: userPasscode,
userGender: userGender,
isUserChildOrParent: isUserChildOrParent)
self.users.append(user)
self.users.sort(by: {$0.birthday < $1.birthday})
self.usersTableView.reloadData()
})
}
completion()
}
}
Как видите, я извлекаю некоторую информацию о пользователе из Firebase, а затем использую один из этих параметров для извлечения изображений из Firebase Storage. Так что мне нужно получить информацию о пользователе в рамках завершения, а затем получить их пользовательские фотографии в рамках ДРУГОГО завершения, и вот где я в тупике.
Я не думаю, что мои обработчики завершения написаны правильно, но я не уверен, что делаю неправильно.
Любая помощь будет принята с благодарностью! Бонусные баллы за то, что помогли мне лучше понять обработчики завершения.:-) Они все еще сбивают меня с толку.
РЕДАКТИРОВАТЬ #1: Забыл добавить код завершения после выполнения функции.
loadExistingUsers {
self.instructionsLabel.text = "Choose daily and weekly job assignments for \(self.users[3].firstName)"
self.userImage.image = self.users[3].photo
}