Macros Hardware iOS devices
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
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
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
C'est classe devrait t'intéresser
http://github.com/erica/uidevice-extension/blob/master/UIDevice-Hardware.m
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.
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.
Pour tester le device, j'utilise actuellement cette macro perso :
et je teste comme ça dans le code :
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 ?
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).
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 ?
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 ?
Je l'utilisais, mais comme je rends compatible à partir de 3.2, je préfère cette solution maintenant.
J'utilise 2 projets. Mais ça revient au même.
Donc comme tu disais Ali, j'ai 2 types de macros.
Les macros définies dans mon prefix.pch :
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 :
ou bien :
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 ?
C'est bien la première fois que tu me fais une réponse aussi brève. Demain, il neige.