stockage des données

jean-lucjean-luc Membre
février 2018 modifié dans API UIKit #1

Bonjour,
je cherche des informations sur le ou les endroits où sont stockées les données d'une application.
dans mon cas, en particuliers des images.
Dans mon application, je télécharge une image vers un répertoire avec ces instructions :

 var paths =   NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
                    if paths.count > 0 {
                        documentsDirectory = paths[0]
 let savePath = documentsDirectory! + "/" + "Apnee_noire.jpg"

Le répertoire en question est du genre :
/Users/jean-luc/Library/Developer/CoreSimulator/Devices/F6BB6DD1-073A-42B0-9162-46C769E26326/data/Containers/Data/Application/E78254D8-D48E-4D5D-B981-44B8E1E7C4A1/Documents/Apnee_noire.jpg
Je peux par ailleurs retrouver ce fichier et le supprimer.

Mais il se trouve que même après sa suppression, cette image s'affiche encore.
Si je modifie l'image dans le répertoire source, c'est toujours l'ancienne version qui s'affiche (même après redémarrage du programme).
Pour afficher la version modifiée, il faut que je supprime l'application et la réinstalle.
J'ai aussi essayé de supprimer, sans succès, des fichiers temporaires avec ces instructions

 FileManager.default.clearTmpDirectory()
extension FileManager {
    func clearTmpDirectory() {
        do {

            print("clear temporary directories")
            let tmpDirURL = FileManager.default.temporaryDirectory
            let tmpDirectory = try contentsOfDirectory(atPath: tmpDirURL.path)
            try tmpDirectory.forEach { file in
                let fileUrl = tmpDirURL.appendingPathComponent(file)
                try removeItem(atPath: fileUrl.path)
            }
        } catch {
            //catch the error somehow
        }
    }
 }

merci

Réponses

  • Bonjour,

    Ton explication n'est pas très claire.
    Est-ce une image que tu obtiens en dehors de ton programme et que tu enregistres dedans ?
    Ce qui me fait dire cela : "je télécharge une image vers" et "savePath"
    Si oui, comme écris-tu l'image dans ta sandbox ?
    Est-ce que tu ne recharges pas l'image depuis l'extérieur ?
    D'où vient l'image modifiée ?
    ...??

  • CéroceCéroce Membre, Modérateur

    À mon avis, le problème est ailleurs. Voici ma théorie.

    NSURLSession et NSURLConnection utilisent un cache sur le disque. Tant que la ressource dans le cache est valide, elle n'est pas re-téléchargée.

    Si tu changes l'image sur le serveur, mais que l'URL est toujours la même et que le serveur ne spécifie pas de date d'expiration, tu obtiendras l'image en cache. Ça expliquerait pourquoi tu as bien la nouvelle image quand tu supprimes l'application: ça supprimerait le cache en même temps.

  • Céroce,
    ton explication me paraît cohérente avec le fonctionnement. Mais peux-t-on vider le cache?

    Eric P.
    Je télécharge l'image depuis le répertoire Web d'un NAS.
    le code de téléchargement est le suivant :
    func imageUpLoad(adresseImage: String) {
    let urlStr = "http://xxx.xxx.xxx.xxx/Couvertures_Livres/" + adresseImage
    let url = URL(string: urlStr)

                                    if url != nil {
                                        let task = URLSession.shared.dataTask(with: (url!)) { (data, response, error)  in
                                            if (error != nil) {
                                                print("erreur")
                                            }  else {
                                                var documentsDirectory: String?
                                                var paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
                                                if paths.count > 0 {
                                                    documentsDirectory = paths[0]
                                                    print("dir \(String(describing: documentsDirectory!))")
                                                    let savePath = documentsDirectory! + "/" + adresseImage
                                                    self.fileUpload = savePath
                                                    print("upload  savePath  \(savePath)")
                                                            //self.deleteFile(fileName: adresseImage)
                                                    FileManager.default.createFile(atPath: savePath, contents: data, attributes: nil)
                                                    DispatchQueue.main.async {
                                                        self.couvertureLivre.image = UIImage(named: savePath)
                                                    }
                                                    //try? FileManager.default.removeItem(atPath: savePath)
                                                }
                                            }
                                        }
                                        task.resume()
                                    }  else {
                                        print("image introuvable")
                                    }
                                }
    

    Et l'image est stockée dans le répertoire
    /Users/jean-luc/Library/Developer/CoreSimulator/Devices/F6BB6DD1-073A-42B0-9162-46C769E26326/data/Containers/Data/Application/E78254D8-D48E-4D5D-B981-44B8E1E7C4A1/Documents/Apnee_noire.jpg

  • CéroceCéroce Membre, Modérateur

    @jean-luc a dit :
    Mais peux-t-on vider le cache?

    Sans doute, mais il ne faut pas. Le cache est utile ! Il économise la batterie, la bande passante, et accélère l'affichage.

    Reconsidère ton utilisation de HTTP. Soit le serveur fixe la date de péremption dans le header Expires, soit l'URL de la ressource est différente s'il s'agit d'une ressource (image) différente.

Connectez-vous ou Inscrivez-vous pour répondre.