Singleton en Swift - How to ?

LeChatNoirLeChatNoir Membre, Modérateur

Salut,


 


toujours dans la découverte de Swift, me voilà  maintenant confronter à  l'utilisation d'une class Helper pour mes achats InApp.


 


Cette classe helper, j'aimerai pouvoir l'utiliser depuis n'importe quel viewController.


 


La classe helper en, question est une classe proposée par Ray ici : https://www.raywenderlich.com/122144/in-app-purchase-tutorial


 


J'ai donc mon IAPHelper, et dans un viewController, je veux l'utiliser.


 


Je fais donc par exemple



let helper=IAPHelper()
helper.buyProduct(product)

Or, quand je fais ça, ça génère un plantage avec un "send message sent to dealloc instance". Il balance ca quand la requête sur les SKProduct répond...


 


Alors que si dans mon controller, je défini un var helper=IAPHelper(), ça fonctionne.


 


C'est comme si le var faisait un retain dessus alors que le let non.


 


Et je pensais que le IAPHelper était en mode "singleton" et qu'on avait pas trop à  s'occuper de ça..


 


 


Ca fait beaucoup de questions, désolé  :(


 


Réponses

  • Joanna CarterJoanna Carter Membre, Modérateur
    janvier 2017 modifié #2

    Tu as mis le "let helper = IAHelper()" ou ? Si c'est dans une méthode, soit let, soit var, il mourra à  la fin de la méthode.


     


    La différence entre let et var est que, avec un let, une fois assigné on ne peut pas le réassigner, ave un var, on peut le réassigner.


     


    Théoriquement, tu peux le mettre dans chaque viewController qui! en ait besoin mais, étant donné que la plupart des appels vers le Store sont de type "singleton", tu pourrais, par contre, créer la classe IAPHelper comme singleton.



    class IAPHelper // ...
    {
    static let sharedInstance = IAPHelper()

    private init()
    {
    // ...
    }

    // ...
    }

    Mais j'ai vu que le constructeur prends un paramètre pour les productIdentifiers ; du coup, si tu avais plus d'un produit, il vaut mieux suivre le tuto et mettre un static let dans la classe de chaque type de produit (RageProducts.swift).


  • LeChatNoirLeChatNoir Membre, Modérateur

    Oui, c'était dans une méthode. Donc effectivement, s'il meurt à  la fin, ça explique tout.


     


    Pour l'histoire des paramètres, j'ai overridé le constructeur pour pouvoir l'initialiser sans paramètres car dans la vrai vie, on n'a pas forcément une liste exhaustive de produits. Moi je les récupère d'un serveur donc je les mets pas en static dans mon code.


     




    public override init() {
    productIdentifiers = Set()
    super.init()
    SKPaymentQueue.default().add(self)
    }


    Et parfois, je veux juste acheter un item sans vouloir interroger le store avant pour fetcher tous les produits. Bref, je commence à  le modifier le helper.


     


    Je vais essayer ton histoire de static let sharedInstance = IAPHelper()


     


    Merci :)

  • LeChatNoirLeChatNoir Membre, Modérateur

    Ben c'est parfait avec sharedInstance.


     


    Merci !

  • Joanna CarterJoanna Carter Membre, Modérateur
    N'oublies pas de mettre l'init() en private, afin que l'on ne puisse pas la construire sans utilisant sharedInstance ;)
Connectez-vous ou Inscrivez-vous pour répondre.