Utiliser un block pour OS X et iOS avec une API différente en paramètre

muqaddarmuqaddar Administrateur
novembre 2012 modifié dans Objective-C, Swift, C, C++ #1
Salut,



Je suppose qu'il n'existe aucune astuce pour utiliser ce genre de code pour un projet iOS et OS X:


[color=#4F8187][font=Monaco][size=2]AFImageRequestOperation[/size][/font][/color][color=#000000][font=Monaco][size=2] *operation = [[/size][/font][/color][color=#4F8187][font=Monaco][size=2]AFImageRequestOperation[/size][/font][/color][color=#31595D][font=Monaco][size=2]imageRequestOperationWithRequest[/size][/font][/color][color=#000000][font=Monaco][size=2]:request [/size][/font][/color][color=#31595D][font=Monaco][size=2]imageProcessingBlock[/size][/font][/color][color=#000000][font=Monaco][size=2]:[/size][/font][/color][color=#BB2CA2][font=Monaco][size=2]nil[/size][/font][/color][color=#31595D][font=Monaco][size=2]cacheName[/size][/font][/color][color=#000000][font=Monaco][size=2]:[/size][/font][/color][color=#BB2CA2][font=Monaco][size=2]nil[/size][/font][/color]<br />
[font=Monaco][size=2][color=#31595d]success[/color]:^([color=#703daa]NSURLRequest[/color] *request, [color=#703daa]NSHTTPURLResponse[/color] *response, [color=#703daa]UIImage[/color] *image)[/size][/font]<br />
{<br />
<br />
}




Le fait est que UIImage doit être utilisé sur iOS et NSImage sur OS X.

Le contenu du block est similaire hormis qu'on va traiter UIImage ou NSImage qui arrivent en paramètres...



S'il n'y a pas de moyen, il faut donc dupliquer le block.

Réponses

  • AliGatorAliGator Membre, Modérateur
    Ou une macro qui va valoir UIImage ou NSImage suivant le TARGET_OS.



    Ou faire une classe wrapper / proxy pour manipuler une image qu'elle soir NS ou UI si tu veux te prévois une sorte d'API commune pour les 2 cas et écrire du code qui peut appeler imageWithData, size, et des méthodes du genre que ce soit une NS ou une UI...
  • muqaddarmuqaddar Administrateur
    'AliGator' a écrit:


    Ou une macro qui va valoir UIImage ou NSImage suivant le TARGET_OS.




    Pourquoi pas. C'est une idée.




    'AliGator' a écrit:


    Ou faire une classe wrapper / proxy pour manipuler une image qu'elle soir NS ou UI si tu veux te prévois une sorte d'API commune pour les 2 cas et écrire du code qui peut appeler imageWithData, size, et des méthodes du genre que ce soit une NS ou une UI...




    Un exemple de classe Wrapper / proxy ? ça se construit comment ?
  • AliGatorAliGator Membre, Modérateur
    Bah tu fais juste une classe qui contient un NSImage et implemente les méthodes que tu veux exposer. C'est un peu le principe des Class Cluster si tu veux. ça a un intérêt si les APIs de tes 2 classes sont différentes à  la base et que tu veux les mutualiser.



    ça fait longtemps que j'ai pas fait de OSX mais imaginons que UIImage ait une méthode size et NSImage à  une méthode imageSize. ça serait chiant car si tu veux du code générique même avec une macro qui remplace UIImage ou NSImage selon le cas tu nesaurais pas s'il faut appeler size ou imageSize et encore obligé de faire un #if. Si tu fais un proxy, ou wrapper, t'appelles ça comme tu veux, le principe est de déclarer une méthode size dans ton ImageProxy qui va appeler "self.image.size" quand il wrappe une UIImage sur iOS, et "self.image.imageSize" quand il wrappe une NSImage sur OSX.

    Du coup tu fais une implémentation de ImageProxy pour iOS, une autre pour OSX, chacun fait sa tambouille... mais toi ensuite dans ton code tu utilisés des ImageProxy partout et tu n'as plus à  te poser de question si en interne c'est une NSImage ou UIImage.



    Bien sûr ça n'a d'intérêt que si tes deux classes ont des API vraiment différentes, pour masquer la vraie classe et avoir une façade générique. Et j'ai pris un exemple avec imageSize alors qu'en vrai ça doit pas exister sur NSImage mais c'etait histoire d'avoir un exemple simple à  expliquer :-P
  • muqaddarmuqaddar Administrateur
    Merci à  toi.

    Je vais tester ça prochainement.
Connectez-vous ou Inscrivez-vous pour répondre.