NSNumber et format d'enregistrement dans un PList ?

Salut la compagnie,



Je rencontre un petit problème actuellement, j'enregistre un fichier de configuration au format PList pour un service d'OS X Server, dans cette config j'ai des booléens, naturellement représentés par une instance de NSNumber en mémoire.



Dans le fichier de configuration d'origine, ce sont des integer qui servent à  coder le booléen. Lorsque mon logiciel réécrit la configuration, il remplace par des booléens. Fondamentalement ce n'est pas censé poser problème sauf que la même config décrite avec des integer marche alors qu'avec des bool ça ne marche pas.



Je pense donc qu'il y a un truc foireux dans l'interprétation des données côté service sauf que je ne peux rien y changer...



Je cherche donc un moyen d'imposer à  un NSNumber de se considérer comme un integer et non un booléen lors d'un enregistrement...



Si quelqu'un a une idée...



Yoann

Réponses

  • AliGatorAliGator Membre, Modérateur
    Quand tu réécris la configuration, tu as entre temps modifié ces objets NSNumber ?

    Si oui, tu as créé les nouveaux avec numberWithInt ou avec numberWithBool ?
  • devulderdevulder Membre
    avril 2012 modifié #3
    'yoann' a écrit:


    Salut la compagnie,



    Je rencontre un petit problème actuellement, j'enregistre un fichier de configuration au format PList pour un service d'OS X Server, dans cette config j'ai des booléens, naturellement représentés par une instance de NSNumber en mémoire.



    Dans le fichier de configuration d'origine, ce sont des integer qui servent à  coder le booléen. Lorsque mon logiciel réécrit la configuration, il remplace par des booléens. Fondamentalement ce n'est pas censé poser problème sauf que la même config décrite avec des integer marche alors qu'avec des bool ça ne marche pas.



    Je pense donc qu'il y a un truc foireux dans l'interprétation des données côté service sauf que je ne peux rien y changer...



    Je cherche donc un moyen d'imposer à  un NSNumber de se considérer comme un integer et non un booléen lors d'un enregistrement...



    Si quelqu'un a une idée...



    Yoann




    Etrange comme problême image/smile.png' class='bbc_emoticon' alt=':)' />



    Tu peux regarder si ton NSNumber est du bon type, en regardant sa class



    exemple:


    <br />
       NSNumber *a0 = [NSNumber numberWithInt:5];<br />
    	NSNumber *a1 = [NSNumber numberWithBool:YES];<br />
    	  NSLog(@&quot;%@&quot;,[a0 class]);<br />
    	NSLog(@&quot;%@&quot;,[a1 class]);<br />




    ca t'affiche le type:



    __NSCFNumber

    __NSCFBoolean



    Pas sur que cela t'aide.
  • 'AliGator' a écrit:


    Quand tu réécris la configuration, tu as entre temps modifié ces objets NSNumber ?

    Si oui, tu as créé les nouveaux avec numberWithInt ou avec numberWithBool ?




    Oui justement, il est modifié par un bindings sur une check box...



    Si je pouvais trouver un truc pour éviter un [NSNumber numberWithInt:[property intValue]] ça m'arrangerait...
  • 'devulder' a écrit:
    Etrange comme problême image/smile.png' class='bbc_emoticon' alt=':)' /> Tu peux regarder si ton NSNumber est du bon type, en regardant sa class exemple:
    NSNumber *a0 = [NSNumber numberWithInt:5]; NSNumber *a1 = [NSNumber numberWithBool:YES]; NSLog(@&quot;%@&quot;,[a0 class]); NSLog(@&quot;%@&quot;,[a1 class]);
    ca t'affiche le type: __NSCFNumber __NSCFBoolean Pas sur que cela t'aide.




    J'ai eu récemment le besoin de déterminer si un NSNumber était de type BOOL, pour une conversion en texte true, false.

    Une recherche sur internet m'a permis de trouver que la méthode la plus fiable était celle-ci:
    <br />
    if([value isKindOfClass:[NSNumber class]])<br />
      {<br />
      if(strcmp([value objCType], @encode(BOOL)) == 0)<br />
       return ([value boolValue]) ? @&quot;true&quot; : @&quot;false&quot;;<br />
      else<br />
       return [value stringValue];<br />
      }<br />
  • 'mpergand' a écrit:


    J'ai eu récemment le besoin de déterminer si un NSNumber était de type BOOL, pour une conversion en texte true, false.

    Une recherche sur internet m'a permis de trouver que la méthode la plus fiable était celle-ci:




    Le problème n'est pas tant de le déterminer que de l'imposer... Comment faire pour que le binding de la checkbox envoi un int et non un BOOL ?
  • CéroceCéroce Membre, Modérateur
    À part utiliser un NSValueTransformer, je ne vois pas.
  • Quelle est la différence entre BOOL et un int, pour moi il n'y en a pas.

    C'est la salade interne aux bindings, qui finit toujours par poser des problèmes

    A part utiliser un valueTransformer , je vois pas trop de solution. [grillé par Ceroce]
  • 'mpergand' a écrit:


    Quelle est la différence entre BOOL et un int, pour moi il n'y en a pas.

    C'est la salade interne aux bindings, qui finit toujours par poser des problèmes

    A part utiliser un valueTransformer , je vois pas trop de solution. [grillé par Ceroce]




    Les bindings n'y sont pour rien, c'est le code à  qui est destiné le fichier de configuration (vpnd) qui est foireux. Je ne sais pas ce qu'ils ont branlé avec mais il ne sait pas interpréter un bool à  la place d'un int...



    Je vais regarder du coté des NSValueTransformer
  • mpergandmpergand Membre
    avril 2012 modifié #10
    La gestion des booléens dans les plist a toujours été le bazar depuis le début d'OSX.



    Si on regarde la façon dont sont sauvegardés ces bools, celle-ci diffèrent selon la version de l'OS ou/et des applications.

    Ainsi on peut trouver des entiers 0/1 ou des chaines Yes/No ou encore plus récemment <true> <false> (qui doit être une vraie valeur booléenne)



    D'où selon les applications, des interprétations qui peuvent être différentes, surtout si celles-ci date un peu.



    Effectivement, les bindings ne sont peut-être pas directement responsables, mais c'est toujours la galère quand le fonctionnement "standard" ne convient pas.
  • J'ai pu me sortir de là  avec les NSValueTransformer mais je pense que cette v2 de mon application ne va pas durer très longtemps... Il va falloir que je revois l'architecture de mon application pour que chaque module soit hermétique... Avoir des value transformer dans mon interface juste par ce que le service gère mal le truc à  me plait pas...



    Merci pour vos recommandations !
Connectez-vous ou Inscrivez-vous pour répondre.