Как сделать так, чтобы метод вызывался только после того, как отработает другой?
Я использую 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 в блоке загрузки после ее завершения.