2010-05-08 11 views
0

J'ai compris comment fonctionnaient tous les trucs de StoreKit et j'ai testé le code de travail ... mais j'ai un problème.Où dois-je attacher le délégué et l'observateur de StoreKit dans une application Cocos2d?

J'ai fait ma couche/scène "magasin" le SKProductsRequestDelegate. Est-ce la bonne chose à faire? Je reçois l'information initiale du produit comme ceci:

SKProductsRequest *productRequest = [[SKProductsRequest alloc] initWithProductIdentifiers: productIDs]; 

[productRequest setDelegate: self]; 
[productRequest start]; 

Le problème est que si je transition vers une nouvelle scène lorsqu'une demande est en cours, la couche actuelle est retenue par le productRequest. Cela signifie que les touches sur ma nouvelle scène/couche sont gérées à la fois par la nouvelle couche et l'ancienne couche.

je pouvais annuler la productRequest au moment de quitter la scène, mais:

  1. Je ne sais pas si elle est en cours à ce moment-là.
  2. Je ne peux pas le libérer, car il a peut-être été libéré par les délégués de la demande.

Il doit y avoir une meilleure façon de procéder. Je pourrais rendre le délégué une classe externe à la couche actuelle, mais je ne sais pas comment mettre à jour facilement la couche avec les informations sur le produit lorsque le gestionnaire est appelé.

Répondre

0

OK, problème résolu .... ergh.

  1. je suis allé de l'avant et fait le magasin une classe séparée, et résolu la question de callbacks à la scène en ajoutant un délégué à la classe, qui détient la couche de l'interface de magasin. Lorsque les transactions sont terminées, je peux utiliser le délégué pour rappeler ma scène/couche.

  2. J'ai résolu le problème de ne pas savoir si le délégué a été libéré en utilisant la méthode respondsToSelector: avant d'essayer d'envoyer un message.

  3. Il s'avère que le vrai bug a été causé par ma tentative de corriger 1 & 2 en premier lieu. J'ai outrepassé onExit pour me faire savoir quand retirer la classe en tant que délégué du magasin. Il s'avère que j'ai oublié d'appeler [super onExit], qui est l'endroit où la scène est libérée. Par conséquent, il est resté retenu et n'a pas été retiré du TouchHandler. Oops!