[Résolu] Log directory différent sur device que sur simulateur

busterTheobusterTheo Membre
octobre 2015 modifié dans API UIKit #1

Bonjour,


j'ai un problème avec le picker de photo.


 


Sur le simulateur, pas de problème, sur l'iPad, j'ai ce message d'erreur :



 


[PLLogging] Couldn't create log directory: The operation couldn't be completed. (Cocoa error 513.)



Et pourtant, tout fonctionne : pas de crash, et la photo se met bien où je veux et je la retrouve, en gros pas d'erreur ,quoi !!!


 


 


Une idée ?


 


Merci d'avance.


Réponses

  • AliGatorAliGator Membre, Modérateur
    J'ai recherché PLLogging sur Google et j'ai plein de réponses partout, sur Stackoverflow comme ailleurs... t'as cherché un peu avant de venir demander ?!
  • Tu m'étonnes, ça fait plusieurs jours que je me tartine des tonnes de trucs où j'essaie plein de choses que je ne comprend pas, et ça déconne toujours.


  • Comme je tombais effectivement sur Stackoverflow, du coup, je m'y suis inscris. C'est pas fun comme forum, mais bon. En tout cas, ce que j'en retiens, c'est que c'est un bug d'Apple. J'aime pas trop ce genre de réponse, cela me fait douter.


  • Comment tu crées le le "log directory" ?


  • busterTheobusterTheo Membre
    octobre 2015 modifié #6

    let documentsDir = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,.UserDomainMask, true)[0] as! String

    nomPhoto = "unNom.png"
    let pathFull: String = documentsDir + "/" + nomPhoto

    let pngFullData: NSData = UIImagePNGRepresentation(newImageScaled)
    pngFullData.writeToFile(pathFull as String, atomically: true)

    je t'ai fait un code simplifié au niveau des noms de var.


     


    Mais ça marche imper sur le simulateur


  • LarmeLarme Membre
    octobre 2015 modifié #7

    nomPhoto ressemble à  quoi ? Il n'aurait pas des caractères un peu spéciaux ? En bref, tout ce qui peut-être différent de a à  z, version majuscule et des chiffres ? Même si les OS offrent souvent la possibilité des accents, toujours favoriser des trucs "basiques" (sous peine quand y'a des trucs en réseau surtout) d'avoir un souci lié à  un mauvais encodage.


    ça fait longtemps que je n'ai pas joué avec ça, et j'suis pas bon en Swift, je fais de l'interprétation avec mes connaissances sur CocoaTouch, mais est-ce que pathFull semble correct ? Tu rajoutes un "/", donc je suppose que documentsDir ne se terminait pas par un "/". Disons que ce sont des pistes possibles. 

    De ce que j'ai lu (et que je n'ai pas vérifié), le simulateur offre quelques possibilités supplémentaires, comme potentiellement d'écrire sur le bundle, ce qui n'est pas possible sur un vrai device (ex. lire un .plist depuis NSBundle et le modifier, et le réécrire au même endroit).


  • busterTheobusterTheo Membre
    octobre 2015 modifié #8

    Merci Larme pour ta réponse.


     


    En attendant, j'ai remanié tout mon coreData, virer mes variables globales, et nettoyer mon fichier externe de variables.


    Bref, ça fait 3 jours que remanie tout le projet, et j'ai bien abouti. J'ai du, pour ce faire, évidemment, retravailler mes algos.


     


    Du coup, je viens de tester, je n'ai plus l'erreur sur l'ipad. Enfin, pour l'instant...


    Un grand merci à  AliGator pour son insistance.


     


    Sans quoi, non, pas de caractères spéciaux, j'avais même tester, comme dans le code indiqué plus haut, avec ce nomPhoto = "unNom.png". Mais tiens, en te répondant, je me dis que je pourrais ôter le ".png" du nom que je stocke dans coreData, et juste le rajouter pour le chemin du fichier.


     


     



     


     


    Tu rajoutes un "/", donc je suppose que documentsDir ne se terminait pas par un "/"

     


    Oui, obligé de le rajouter ce slash, pour que ça déconne pas. Voici les println avec mon code :



     


    sur simulateur


    pathFull = /Users/busterTheo/Library/Developer/CoreSimulator/Devices/2D9BE8B8-D70D-411F-BDCD-54393ADB1A41/data/Containers/Data/Application/EE7F8B26-8B56-4D59-845B-5DC2E1E18397/Documents/FrontalLarme2015-10-07-02-25-06.png


     


    sur ipad


    pathFull = /var/mobile/Containers/Data/Application/717A7CE9-1C8E-436B-BFD5-1ECA0C9BE4AA/Documents/FrontaLarme2015-10-07-02-30-52.png


     


     


     


    Merci pour l'info sur le bundle et le .plist, mais j'avais un peu tout tester, et j'avais opté pour la solution de stocker le nom du fichier image dans le coreData comme ça, en String :



    "Frontal\(nomTextField.text)\(theDate).png"

    Ainsi, chaque image ne peut avoir qu'un nom unique.


    Et je le stocke dans le documentsDir, comme plus haut.


     


    Y'a certainement mieux à  faire, mais je trouve ça pas mal, et ça fonctionne bien.


     


    Tout ça, bien sûr, avec l'aide de tous les barmen, sans qui je n'en serais encore qu'aux balbutiements. :o


     


    J'ai à  peu près résolu tous mes problèmes, je m'en retourne donc dans Instruments, et évidemment, je vais reposter à  gogo, parce que c'est vraiment chaud ce truc.


     


    La consommation de la mémoire ne fait qu'augmenter, et pourtant, j'ai fait le maximum, dans mon remaniement, pour lui éviter de grimper.


     


    Je ne fais plus d'objectiveC, et je préfère swift, mais c'est vrai qu'en objC, y'avait les release/retain. C'était super pratique. Là , c'est hyper chaud. Faut être sûr de son coup.


     


    Et, effectivement, il vaut mieux monter son projet, avec dès le départ, l'ipad branché, et tester tout de suite sur Instruments.


     


    Je vais faire des tests sur des petits projets bidons, pour pister ces grimpes de mémoire consommée.


     


    Encore merci. Je met résolu sur ce post.


     


    :p     :p




  •  


    en objC, y'avait les release/retain. C'était super pratique.


     


     




    T'as bu ou t'as bu ?

  • Joanna CarterJoanna Carter Membre, Modérateur
    octobre 2015 modifié #10


    T'as bu ou t'as bu ?



    Tout à  fait ! Je n'ai pas utilisé retain/release en Objective-C depuis presque 4 ans.
  • ah sorry


  • DrakenDraken Membre
    octobre 2015 modifié #12

    Ceci dit, les releases/retains n'ont pas disparus. Ils sont toujours là , le compilateur les ajoutant automatiquement dans le code, de manière invisible. Heureusement, parce qu'ils étaient médailles d'or dans la catégorie "bugs par inattention du codeur".


  • Bonjour à  tous,


    je reviens ici vers vous pour dire que j'ai résolu le problème.


     


    Sur simulateur et sur iPad.


     


    Pour ceux qui ont ce problème (Leaks dans Instruments - on the picker de photos), je n'amène pas la solution, mais des précisions.


    Je donne la solution pour mon problème, mais j'en suis certain, personne n'aura ce genre de problème (enfin je pense), c'est propre à  mon projet.


     


    Je ne parle que des Leaks, et non pas de la qualité du code, qui je n'en doute pas mérite quelques remarques.


     


    Donc, les précisions..


     


    1- Concernant la date, String ou NString, ça ne pose pas de problème pour les Leaks :



    var dateFormat = NSDateFormatter()
    dateFormat.dateFormat = "yyyy-MM-dd-HH-mm-ss"
    let now: NSDate = NSDate(timeIntervalSinceNow: 0)
    let theDate: NSString = dateFormat.stringFromDate(now)

    2- Concernant le pathFull, avec ou sans (stringByAppendingString), ça ne pose pas de problème pour les Leaks :



    let pathFull: String = documentsDir + "/" + "nomDeMaPhotoPourExemple.png"
    let pngFullData: NSData = UIImagePNGRepresentation(newImageScaled)
    pngFullData.writeToFile(pathFull as String, atomically: true)

    ou (voire rajouter un slash ->  stringByAppendingString("/nomDeMaPhotoPourExemple.png"))



    let pathFull: NSString = documentsDir.stringByAppendingString("nomDeMaPhotoPourExemple.png")
    let pngFullData: NSData = UIImagePNGRepresentation(newImageScaled)
    pngFullData.writeToFile(pathFull as String, atomically: true)

    Moi je met un slash toujours car (voir plus haut dans le post, les printlns), sans quoi le chemin est DocumentsnomDeMaPhotoPourExemple.png plutôt que Documents/nomDeMaPhotoPourExemple.png - ça me chiffonne un peu.


     


     


     


     


     


     


    La solution à  mon problème, qui ne concerne surement personne, mais on ne sait jamais.


    C'est là  où je vois que je suis vraiment un débutant.


     


    J'ai mis deux jours à  isoler la source de mes Leaks. Cela ne venait pas, évidemment des méthodes/fonctions/constantes d'Apple.


     


    Il s'agit encore une fois (si j'ai bien compris) d'une histoire de "optionnal binding" (ou "optionnal chaining" - faut que je révise).


    En tout cas, depuis que j'ai appris ce truc, il me sauve régulièrement la vie.


    Merci aux cours des barmen, là -dessus.


     


    Je construis le nom de la photo pickée (pour enregistrer la photo, ainsi que stocker son nom dans une variable, car j'en ai besoin), à  l'aide du nom rempli dans un champ "nom", et de la date (jusqu'aux secondes), ainsi qu'un identifiant textuel ciblant laquelle des 5 photos (et oui, y'en a 5) a été piquée.


     


    Donc, le nom :



    nomPhoto= "Frontal\(nomTextField.text)\(theDate).png"

    Avec évidemment un test avant sur le contenu du champ, genre si vide, alors = "manquant" par ex.


     


    Eh bien, c'est ça qui foutait la merde. Cela m'a sauvé et évité les leaks :



    if var leNom1 = nomTextField.text {
    if leNom1 == "" {
    leNom1 = "Nom_manquant"
    }
    nomPhoto = "Frontal\(leNom1)\(theDate).png"
    let pathFull: String = documentsDir + "/" + "Frontal\(leNom1)\(theDate).png"
    let pngFullData: NSData = UIImagePNGRepresentation(newImageScaled)
    pngFullData.writeToFile(pathFull as String, atomically: true)
    }

    Il fallait donc cela :



    if var leNom1 = nomTextField.text {
    ...
    }

    C'est dingue ce truc.


     


    Bref, je met quand même mon code complet, au cas où.


    Cela, avec mes vrais noms de variables...


    Désolé, mais comme y'a 5 photos tapées (gesture), y'a un switch sur le tag.


     


    Et je met résolu.



    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
    let imagePickee: UIImage = info[UIImagePickerControllerOriginalImage] as! UIImage

    if let newImageScaled = scaledImageWithImage(imagePickee, size: taillePhotos) as UIImage? {
    let documentsDir = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,.UserDomainMask, true)[0] as! String

    var dateFormat = NSDateFormatter()
    dateFormat.dateFormat = "yyyy-MM-dd-HH-mm-ss"
    let now: NSDate = NSDate(timeIntervalSinceNow: 0)
    let theDate: NSString = dateFormat.stringFromDate(now)

    switch(self.lastTappedImageView!.tag) {
    case 1:
    if let newVignetteScaled = scaledImageWithImage(imagePickee, size: tailleVignettes) as UIImage? {
    if var leNom1 = nomTextField.text {
    if leNom1 == "" {
    leNom1 = "Nom_manquant"
    }
    listeDesVariables.frontalPatientFullURL = "Frontal\(leNom1)\(theDate).png"
    let pathFull: String = documentsDir + "/" + "Frontal\(leNom1)\(theDate).png"
    let pngFullData: NSData = UIImagePNGRepresentation(newImageScaled)
    pngFullData.writeToFile(pathFull as String, atomically: true)
    }
    frontalPatientImageView?.image = newVignetteScaled
    }
    case 2:
    if let newVignetteScaled = scaledImageWithImage(imagePickee, size: tailleVignettes) as UIImage? {
    if var leNom2 = nomTextField.text {
    if leNom2 == "" {
    leNom2 = "Nom_manquant"
    }
    listeDesVariables.photo2PatientFullURL = "Bpnmbf\(leNom2)\(theDate).png"
    let pathFull: String = documentsDir + "/" + "Bpnmbf\(leNom2)\(theDate).png"
    let pngFullData: NSData = UIImagePNGRepresentation(newImageScaled)
    pngFullData.writeToFile(pathFull as String, atomically: true)
    }
    BpnmbfPatientImageView?.image = newVignetteScaled
    }
    case 3:
    if let newVignetteScaled = scaledImageWithImage(imagePickee, size: tailleVignettes) as UIImage? {
    if var leNom3 = nomTextField.text {
    if leNom3 == "" {
    leNom3 = "Nom_manquant"
    }
    listeDesVariables.photo3PatientFullURL = "Cfnms\(leNom3)\(theDate).png"
    let pathFull: String = documentsDir + "/" + "Cfnms\(leNom3)\(theDate).png"
    let pngFullData: NSData = UIImagePNGRepresentation(newImageScaled)
    pngFullData.writeToFile(pathFull as String, atomically: true)
    }
    CfnmsPatientImageView?.image = newVignetteScaled
    }
    case 4:
    if let newVignetteScaled = scaledImageWithImage(imagePickee, size: tailleVignettes) as UIImage? {
    if var leNom4 = nomTextField.text {
    if leNom4 == "" {
    leNom4 = "Nom_manquant"
    }
    listeDesVariables.photo4PatientFullURL = "Dpnms\(leNom4)\(theDate).png"
    let pathFull: String = documentsDir + "/" + "Dpnms\(leNom4)\(theDate).png"
    let pngFullData: NSData = UIImagePNGRepresentation(newImageScaled)
    pngFullData.writeToFile(pathFull as String, atomically: true)
    }
    DpnmsPatientImageView?.image = newVignetteScaled
    }
    case 5:
    if let newVignetteScaled = scaledImageWithImage(imagePickee, size: tailleVignettes) as UIImage? {
    if var leNom5 = nomTextField.text {
    if leNom5 == "" {
    leNom5 = "Nom_manquant"
    }
    listeDesVariables.photo5PatientFullURL = "EaiETs\(leNom5)\(theDate).png"
    let pathFull: String = documentsDir + "/" + "EaiETs\(leNom5)\(theDate).png"
    let pngFullData: NSData = UIImagePNGRepresentation(newImageScaled)
    pngFullData.writeToFile(pathFull as String, atomically: true)
    }
    EaiETsPatientImageView?.image = newVignetteScaled
    }
    default:
    break
    }
    self.lastTappedImageView = nil
    }
    picker.dismissViewControllerAnimated(true, completion: nil)
    }

    Merci au bar.       :p   :D   :p

  • Je viens de me rendre compte que j'ai deux posts qui se chevauchent. Désolé.


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