Singleton en Swift - How to ?
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
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.
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).
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.
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
Ben c'est parfait avec sharedInstance.
Merci !