Saya ingin mempelajari cara mengambil gambar dengan benar dari Firebase untuk pengguna saat ini. Saya mencoba mendapatkan pengguna ImageUrl dari tabel User dan menggunakan url itu untuk menampilkan gambar di bawah, tetapi ternyata berhasil jangan lakukan itu dan crash aplikasi. Saya ingin tahu apakah saya melakukannya dengan benar atau salah. Terima kasih sebelumnya

   func retrieveTheImage() {
    
    let userID = Auth.auth().currentUser?.uid
    
    let retrieveTheUrl = Database.database().reference().child("User").child(userID!)
    
    
    var capatureUrl :String = ""
    retrieveTheUrl.observeSingleEvent(of: .value) { (snapShot) in
        
       
        if let snapShotValue = snapShot.value as? Dictionary<String,String>{
           
            let url = snapShotValue["ImageUrl"]! /
            capatureUrl = url
            print(capatureUrl)
        }
    }
    
    let storage = Storage.storage()
    var reference: StorageReference!
    reference = storage.reference(forURL: capatureUrl)
    reference.downloadURL { (url, error) in
        let data = NSData(contentsOf: url!)
        let image = UIImage(data: data! as Data )
        self.imageUser.image = image
    }
}
0
Jose G 6 Agustus 2019, 22:27

1 menjawab

Jawaban Terbaik

Kode Anda benar-benar berfungsi ... hampir.

Masalah dengan kode tersebut adalah Firebase tidak sinkron sehingga data hanya menjadi valid dalam penutupan setelah panggilan firebase.

Jadi inilah yang terjadi (kode kental)

    func retrieveTheImage2() {
        let userID = Auth.auth().currentUser?.uid
        let retrieveTheUrl = Database.database().reference().child("User").child(userID!)
           //code in closure//
        }
        
        //code after closure//
-->     reference = storage.reference(forURL: capatureUrl) //not valid
        reference.downloadURL { (url, error) in
        }
    }

Kode setelah penutupan akan dieksekusi sebelum //kode dalam penutupan//.

Itu berarti capatureUrl akan menjadi nihil karena belum diisi. Kode lebih cepat dari internet.

Untuk memperbaikinya, cukup pindahkan kode yang mengakses data dari Firebase dalam penutupan.

func retrieveTheImage2() {
    let userID = Auth.auth().currentUser?.uid
    let retrieveTheUrl = Database.database().reference().child("User").child(userID!)
    var capatureUrl :String = ""
    retrieveTheUrl.observeSingleEvent(of: .value) { (snapShot) in
        if let snapShotValue = snapShot.value as? Dictionary<String,String>{
            let url = snapShotValue["ImageUrl"]!
            capatureUrl = url
            print(capatureUrl)
            
            let storage = Storage.storage()
            var reference: StorageReference!
            reference = storage.reference(forURL: capatureUrl) //will be valid here.
            reference.downloadURL { (url, error) in
                let data = NSData(contentsOf: url!)
                let image = UIImage(data: data! as Data )
                self.imageUser.image = image
            }
        }
    }
}

Secara umum, dibutuhkan waktu untuk mengembalikan data dari internet dan itulah tujuan penutupan Firebase - kode tersebut dijalankan saat data valid. Jadi, jika Anda ingin bekerja dengan data Firebase, cobalah untuk mengaksesnya terlebih dahulu dalam penutupan tersebut.

1
marc_s 7 Juli 2020, 16:52