Как сделать так, чтобы метод вызывался только после того, как отработает другой?

Я использую firebase для авторизации пользователя и хранения его данных. И у меня есть картинка, которую я заливаю в Storage при помощи данного метода:

    private func uploadImage(image: UIImage, data: Data) -> URL? {
        var url: URL?

        let filename = NSUUID().uuidString

        let profileRef = Storage.storage().reference().child("profileImages").child(filename)

        let uploadTask = profileRef.putData(data, metadata: nil) { (metadata, error) in

            let profileRef = StorageReference().child("profileImage")
            if let err = error {
                self.showErrorAlert(with: err.localizedDescription)
                print("Failed to uploud image: ", err.localizedDescription)
                return
            }

            var profileImageUrl: URL?
            let profileImageUrlTask = profileRef.downloadURL { (imgUrl, error) in
                if let err = error {
                    self.showErrorAlert(with: err.localizedDescription)
                    print("Failed to get image url: ", err.localizedDescription)
                    return
                }

                print("Successfully upload profile image: ", imgUrl)

                url = imgUrl
                self.isImageUplouded = true
            }
        }

        print(#function)
        return url
    }

И сохраняю пользователя в Realtime data base.

    private func saveUserIntoDatabase(username: String, uid: String, imageUrl: URL?) {
        Database.database().reference().child("users").updateChildValues([uid:["username":username, "profileImageUrl":imageUrl]]) { (error, reference) in
            if let err = error {
                self.showErrorAlert(with: err.localizedDescription)
                print("Failed to add user into database: ", err.localizedDescription)
                return
            }

            print("User " + username + " saved with image: \(imageUrl?.absoluteString)")
        }
        print(#function)
    }

Данные два метода я вызываю в замыкании метода createUser:

    private func createUser(email: String, password: String, imageToUpload: UIImage, data: Data, username: String) {
        Auth.auth().createUser(withEmail: email, password: password) { (result, error) in
            if let err = error {
                self.showErrorAlert(with: err.localizedDescription)
            }
            print("User created ", result?.user.uid)


            let imgURL = self.uploadImage(image: imageToUpload, data: data)

            guard let uid = result?.user.uid else { return }
            self.saveUserIntoDatabase(username: username, uid: uid, imageUrl: imgURL)
        }
        print(#function)
    }

Но метод saveUserIntoDatabaseвызывается до того, как в Storage зальется картинка, соответственно в БД создается только пользовать, у которого доступен только username, а profileImageUrl нет.

Вот что выводится в консоль

createUser(email:password:imageToUpload:data:username:)
User created  Optional("KwcCguJUaqevJuv00CEEu1ST5X63")
uploadImage(image:data:)
saveUserIntoDatabase(username:uid:imageUrl:)
User Test56 saved with image: nil
Successfully upload profile image:  Optional(https://firebasestorage.googleapis.com/url-to-image)

Ответы (1 шт):

Автор решения: Oleg Soloviev

Передайте result и username в функцию uploadImage и в ней же вызовите метод saveUserIntoDatabase в блоке загрузки после ее завершения.

→ Ссылка