masalah dengan pelaksanaan fungsi yang mengikuti Referensi Penyimpanan Firebase di Swift

Saya menggunakan kode berikut untuk memperbarui foto profil di 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 adalah fungsi yang dibuat untuk memicu childChanged sehingga pengguna mengunduh foto profil baru. Itu belum berfungsi dan menurut saya itu karena dipanggil sebelum StorageReference selesai diperbarui. Apakah ada cara untuk memastikan bahwa fungsi tersebut dipanggil hanya setelah Referensi selesai?


person Sudacris    schedule 11.07.2017    source sumber


Jawaban (2)


Untuk kode yang perlu Anda panggil hanya ketika blok penyelesaian berjalan, Anda harus meletakkan kode tersebut di dalam blok penyelesaian, jadi ubah:

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)
    }

Jika updateProfilePic harus selalu dipanggil setelah blok penyelesaian berhasil

person jlmurph    schedule 11.07.2017
comment
sepertinya pertanyaannya sudah terjawab, semoga bisa memperbaiki masalah yang lebih luas juga - person Sudacris; 11.07.2017
comment
Membalas dengan cepat memang! ha ha - person jlmurph; 11.07.2017
comment
itu berfungsi sekarang, terima kasih. Itu adalah masalah aneh yang saya telusuri kembali ke penyebab ini - person Sudacris; 11.07.2017

Untuk memastikan bahwa updateProfilePic() dipanggil setelah pengunggahan selesai, pindahkan ke pengendali callback/penyelesaian:

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