Macros Hardware iOS devices

janvier 2011 modifié dans API UIKit #1
Bonjour a tous,

J'aimerais si possible des informations concernant les maccros possibles concernant la détection du hardware d'un iPhone.
Par exemple, j'aimerais optimiser un chargement asynchrone d'images dans une table. Sur l'iPhone 4, j'ai remarqué sur l'app store que les images sont chargées a chaque fois qu'une celle est recyclée, alors que sur un 3G, le chargement se fait a la fin du scroll.

C'est une optimisation très intéressante et pour la réaliser j'aimerais connaitre la version de l'iPhone, et non de l'OS, étant donné que iOS 4 tourne sur 3G

Je n'ai rien vu de tel sur UIDevice, c'est pourquoi je me penche maintenant sur les maccros (bien que je sache pas si c'est vraiment le terme employé)

Merci,
Louka

Réponses

  • manu57manu57 Membre
    02:18 modifié #2
    Tu peux identifier le hardware avec UIDevice.  Notamment la propriété "model" qui renvoie  @iPhone@iPhone 3G, @iPhone 3G S etc...

  • devulderdevulder Membre
    02:18 modifié #3
    dans 1277465582:

    Bonjour a tous,

    J'aimerais si possible des informations concernant les maccros possibles concernant la détection du hardware d'un iPhone.
    Par exemple, j'aimerais optimiser un chargement asynchrone d'images dans une table. Sur l'iPhone 4, j'ai remarqué sur l'app store que les images sont chargées a chaque fois qu'une celle est recyclée, alors que sur un 3G, le chargement se fait a la fin du scroll.

    C'est une optimisation très intéressante et pour la réaliser j'aimerais connaitre la version de l'iPhone, et non de l'OS, étant donné que iOS 4 tourne sur 3G

    Je n'ai rien vu de tel sur UIDevice, c'est pourquoi je me penche maintenant sur les maccros (bien que je sache pas si c'est vraiment le terme employé)

    Merci,
    Louka


    C'est classe devrait t'intéresser

    http://github.com/erica/uidevice-extension/blob/master/UIDevice-Hardware.m
  • AliGatorAliGator Membre, Modérateur
    02:18 modifié #4
    1) Le chargement des images à  chaque recyclage des cells ou qu'à  la fin du scroll, ce n'est pas du tout dépendant du hardware.
    Je suis en train de faire cette optimisation sur mon appli justement, et faut juste que ta vue demande au modèle de charger l'image que lors du willDecelerate & co de UITableViewDelegate.
    Je comptais d'ailleurs m'inspirer des idées de http://github.com/akosma/async-uitableview/ tu peux regarder aussi.
    Que ce soit sur iPhoneOS3, iOS4, ou que ce soit sur iPhone3G, 3GS ou 4, tout ça ne change rien, c'est à  toi de coder le chargement asynchrone de tes images.

    2) Après si c'est pour savoir si tu es sur un iPhone ou un iPad, tu peux utiliser UI_USER_INTERFACE_IDIOM. Y'a une session de la WWDC qui parle de ça aussi.
  • 02:18 modifié #5
    dans 1277467606:

    1) Le chargement des images à  chaque recyclage des cells ou qu'à  la fin du scroll, ce n'est pas du tout dépendant du hardware.
    Je suis en train de faire cette optimisation sur mon appli justement, et faut juste que ta vue demande au modèle de charger l'image que lors du willDecelerate & co de UITableViewDelegate.
    Je comptais d'ailleurs m'inspirer des idées de http://github.com/akosma/async-uitableview/ tu peux regarder aussi.
    Que ce soit sur iPhoneOS3, iOS4, ou que ce soit sur iPhone3G, 3GS ou 4, tout ça ne change rien, c'est à  toi de coder le chargement asynchrone de tes images.


    Je viens de regarder, et c'est exactement la même méthode que j'utilise, à  quelques détails près.
    J'appelle pour l'instant le chargement des images au décelerate de la scrollView.
    Quand je parle de chargement d'image, je voulais dire plutôt "téléchargement".
    Ainsi, sur l'App Store iPhone, j'ai remarqué que l'iPhone 4 (et peut-etre le 3GS?) opérait le téléchargément dès que tableView:cellAtIndexPath: est appelé ! Alors que le 3G utilise bien une méthode plus "soft" et adaptée à  ses performances : un téléchargement à  la décéleration de la scrollview.
  • muqaddarmuqaddar Administrateur
    janvier 2011 modifié #6
    Hello,

    Pour tester le device, j'utilise actuellement cette macro perso :

    #define kUSER_INTERFACE_IDIOM [[UIDevice currentDevice] userInterfaceIdiom]
    


    et je teste comme ça dans le code :

    if (kUSER_INTERFACE_IDIOM == UIUserInterfaceIdiomPad) <br />			{<br />				//iPad specific code.<br />			}<br />			if (kUSER_INTERFACE_IDIOM == UIUserInterfaceIdiomPhone)<br />			{<br />				//iPhone specific code.<br />			}
    


    C'est toujours la meilleure méthode à  l'heure actuelle ?

    Je n'aime pas ce genre de dénomination : UIUserInterfaceIdiomPhone (car ça marche aussi pour l'iPod Touch). Je sais, je suis tatillon.  :P


    Je préfère ne pas faire un if...else au cas où on ait un autre appareil un jour (on rajoutera un 3ème if).  :P


    EDIT : où ai-je la tête ce matin ?

    #define kUSER_INTERFACE_IDIOM_PAD ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) <br />#define kUSER_INTERFACE_IDIOM_PHONE ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
    
  • muqaddarmuqaddar Administrateur
    02:18 modifié #7
    Par exemple :

    if kUSER_INTERFACE_IDIOM_PAD [self.navigationBar.topItem setTitle:_T(kCountry)];<br />	if kUSER_INTERFACE_IDIOM_PHONE self.navigationItem.title = _T(kCountry);
    


    C'est parfois dur de faire des choix entre mettre des macros partout (beurk) ou réécrire une classe complète avec bcp de code commun (non agile).
  • muqaddarmuqaddar Administrateur
    02:18 modifié #8
    Bon, je continue sur ce thread puisque c'est lié aussi à  l'uniformisation de code et aux astuces de code pour iPhone/iPad.

    Dans la série "je me suis fait avoir", j'avais rendu une méthode delegate optionnelle puisqu'elle n'avait à  être utilisée que dans la version iPad.

    Voilà  t'y pas que je l'ai effacé dans le contrôleur qui l'implantait... mais que j'avais laissé l'appel à  cette méthode dans l'autre contrôleur : [delegate appelMoiMaMéthode];

    Du coup, le compilo n'a pas bronché car elle était optionnelle, or l'appel est bien là ... donc crash.

    Peut-être enlever le @optionnal et mettre une macro de condition iPad sur la méthode à  la place ?
  • AliGatorAliGator Membre, Modérateur
    02:18 modifié #9
    Déjà  tu devrais utiliser plutôt UI_USER_INTERFACE_IDIOM que [tt][UIDevice userInterfaceIdiom][/tt], qui est + compatible avec même les anciens OS.

    Ensuite, si tu fais une version iPhone et une version iPad, par exemple si tu utilises un seul projet mais deux targets, tu peux utiliser les macros et en définir une dans ton les build settings de target "Vinocella iPad" et une autre dans les build settings de ton target "Vinocella iPhone", non ?
  • muqaddarmuqaddar Administrateur
    02:18 modifié #10
    dans 1296308867:

    Déjà  tu devrais utiliser plutôt UI_USER_INTERFACE_IDIOM que [tt][UIDevice userInterfaceIdiom][/tt], qui est + compatible avec même les anciens OS.


    Je l'utilisais, mais comme je rends compatible à  partir de 3.2, je préfère cette solution maintenant.

    dans 1296308867:

    Ensuite, si tu fais une version iPhone et une version iPad, par exemple si tu utilises un seul projet mais deux targets, tu peux utiliser les macros et en définir une dans ton les build settings de target "Vinocella iPad" et une autre dans les build settings de ton target "Vinocella iPhone", non ?


    J'utilise 2 projets. ;) Mais ça revient au même.
  • muqaddarmuqaddar Administrateur
    02:18 modifié #11
    Je continue ce sujet sur les macros iPhone/iPad.

    Donc comme tu disais Ali, j'ai 2 types de macros.

    Les macros définies dans mon prefix.pch :

    #define kUSER_INTERFACE_IDIOM_PAD ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) <br />#define kUSER_INTERFACE_IDIOM_PHONE ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
    


    et les macros de compilation (je connais pas les termes exacts) définies dans les targets, dans Preprocessor Macros :

    TARGET_OS_PHONE pour le target iPhone
    TARGET_OS_PAD pour le target iPad

    Dans mon code, je peux utiliser indifféremment les deux :

    if kUSER_INTERFACE_IDIOM_PHONE self.navigationItem.title = title;<br />	if kUSER_INTERFACE_IDIOM_PAD [self.navigationBar.topItem setTitle:title];
    


    ou bien :

    #ifdef TARGET_OS_PHONE<br />&nbsp;  self.navigationItem.title = title;<br />#endif<br />#ifdef TARGET_OS_PAD<br />&nbsp;  [self.navigationBar.topItem setTitle:title];<br />#endif<br />
    


    Bon, déjà , j'espère que ce sera utile à  d'autres

    Ensuite, je me suis aperçu que je n'avais aucun réel intérêt à  utiliser le premier cas, puisque mes applications ne sont pas universelles. Le "choix de code" doit se faire à  la compilation, je n'ai aucun intérêt à  ce qu'il se fasse pendant le runtime, ça alourdit juste l'exécutable de l'application. Me confirmez-vous ce point ?

    Y-a-il d'autres choses auxquelles il faut penser ?
  • AliGatorAliGator Membre, Modérateur
    02:18 modifié #12
    dans 1297263838:
    Me confirmez-vous ce point ?
    Oui :)
  • muqaddarmuqaddar Administrateur
    02:18 modifié #13
    dans 1297269173:

    dans 1297263838:
    Me confirmez-vous ce point ?
    Oui :)


    C'est bien la première fois que tu me fais une réponse aussi brève. Demain, il neige. :)
  • AliGatorAliGator Membre, Modérateur
    02:18 modifié #14
    dans 1297269464:

    dans 1297269173:

    dans 1297263838:
    Me confirmez-vous ce point ?
    Oui :)


    C'est bien la première fois que tu me fais une réponse aussi brève. Demain, il neige. :)
    :D
Connectez-vous ou Inscrivez-vous pour répondre.