проблемы с выполнением функций после ссылки на хранилище Firebase в Swift

Я использую следующий код для обновления изображения профиля в Firebase:

    func saveProfileImage(_ userUID: String, _ completion: @escaping (Error?) -> Void) {
    let resizedImage = image.resized()
    let imageData = UIImageJPEGRepresentation(resizedImage, 1.0)

    ref = StorageReference.profileImages.reference().child(userUID)
    downloadLink = ref.description

    ref.put(imageData!, metadata: nil) {
        (metaData, error) in
        completion(error)
    }
    updateProfilePic(userUID)
}

updateProfilePic — это функция, созданная для запуска childChanged, чтобы пользователи загружали новую фотографию профиля. Он не работает, и я думаю, это потому, что он вызывается до того, как StorageReference завершил обновление. Есть ли способ гарантировать, что функция вызывается только после завершения ссылки?


person Sudacris    schedule 11.07.2017    source источник


Ответы (2)


Для кода, который вам нужно вызывать только при запуске блока завершения, вы должны поместить указанный код внутри блока завершения, поэтому измените:

ref.put(imageData!, metadata: nil) {
        (metaData, error) in
        completion(error)
    }
    updateProfilePic(userUID)

to

    ref.put(imageData!, metadata: nil) {
        (metaData, error) in

        guard error == nil else {
           print("Error from adding to FIRDatabase: \(error)")
           return
        }

        self.updateProfilePic(userUID)
    }

Если updateProfilePic всегда должен вызываться после успешного завершения блока

person jlmurph    schedule 11.07.2017
comment
кажется, что на вопрос дан ответ, надеюсь, он решит и более широкую проблему - person Sudacris; 11.07.2017
comment
Действительно быстрый ответ! ха-ха - person jlmurph; 11.07.2017
comment
теперь работает спасибо. Это была странная проблема, которую я проследил до этой причины - person Sudacris; 11.07.2017

Чтобы убедиться, что updateProfilePic() вызывается после завершения загрузки, переместите его в обработчик обратного вызова/завершения:

func saveProfileImage(_ userUID: String, _ completion: @escaping (Error?) -> Void) {
    let resizedImage = image.resized()
    let imageData = UIImageJPEGRepresentation(resizedImage, 1.0)

    ref = StorageReference.profileImages.reference().child(userUID)
    downloadLink = ref.description

    ref.put(imageData!, metadata: nil) {
        (metaData, error) in
        completion(error)
        updateProfilePic(userUID)
    }
}
person Frank van Puffelen    schedule 11.07.2017