Как мне написать вложенные экранирующие завершения для 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
    }

0 ответов

Другие вопросы по тегам