3
votes

Comment partager une image téléchargée depuis le stockage Firebase entre différentes vues?

C'est le code que j'utilise pour récupérer l'image du stockage. Cela fonctionne comme du charme mais je ne veux pas le télécharger à nouveau sur différentes vues.

func retreiveImagesFromFireBase(downloadUrl:String,imageHolder:UIImageView){
    if downloadUrl != "" {
        let storageRef = Storage.storage().reference(forURL: downloadUrl)
        // Download the data, assuming a max size of 1MB (you can change this as necessary)
        storageRef.getData(maxSize: 5*1024*1024) { (data, error) in
            if error == nil {
                if let pic = UIImage(data: data!) {
                    imageHolder.image = pic
                }
            } else {
                print(error)
            }
        }
    }
}

Comment dois-je gérer cela?


5 commentaires

Mettez l'image en cache. Signifie: vous pouvez conserver l'image en mémoire ou / et enregistrer l'image dans le répertoire cache


Avez-vous plusieurs images utilisées avec une vue différente ou une seule image?


Le mode hors ligne de Firebase fait-il cela pour nous?


J'ai deux images en fait et les deux sont utilisées sur plus de trois vues.


salut @CaptainNewt si vous n'avez que deux images, stockez-les dans userdefault et vous pouvez les utiliser n'importe où, voir ma réponse


3 Réponses :


1
votes

Vous pouvez faire

var image:UIImage? 

Ou utiliser SDWebImage et partager le lien, vous pouvez également créer une variable globale comme

class Service { 
   static let shared = Service()  
   var image1:UIImage?
   var image2:UIImage?
   let imageLink = "//////" // or with SDWebImage
}

if let pic = UIImage(data: data!){
    Service.shared.image = pic
}

mais ce n'est pas recommandé car il n'a pas de regroupement pour informer le développeur que sa source est locale / instance / globale, donc c'est déroutant contrairement au singleton


2 commentaires

Je ne peux pas utiliser de bibliothèques tierces car mes règles de stockage ne leur permettent pas de récupérer les fichiers et je veux des titres, donc je ne peux pas changer les règles.


devrais-je ajouter deux variables UIImage dans cette classe.



2
votes

Déclarez simplement UIImage globalement dans votre classe, et dans votre fonction, où vous définissez imageHolder, attribuez cette image téléchargée à l'image globale et utilisez-la où vous le souhaitez.

UIImage image;

func retreiveImagesFromFireBase(downloadUrl:String,imageHolder:UIImageView){
            if downloadUrl != ""{
                let storageRef = Storage.storage().reference(forURL: downloadUrl)
                // Download the data, assuming a max size of 1MB (you can change this as necessary)
                storageRef.getData(maxSize: 5*1024*1024) { (data, error) in
                    if error == nil{
                        if let pic = UIImage(data: data!){
                            imageHolder.image = pic
                            image = pic // use it on other views 
                        }
                    }else{
                        print(error)
                    }
                }
            }
        }


0 commentaires

2
votes

Si vous n'avez qu'une ou deux images, stockez simplement dans userdefault et vous pouvez accéder dans n'importe quel viewController, stocker image en tant que données dans userdefault chaque fois que vous souhaitez utiliser, il suffit de convertir les données en image et de les utiliser, voir le code suivant pour convertir les données en image

let image = UIImage(data: imageData)


0 commentaires