2
votes

Quelle est la meilleure façon d'écrire un gestionnaire de complétion

Je travaille actuellement sur la mise en œuvre des achats intégrés dans mon application et après la restauration des achats, je souhaite appeler un achèvement pour effectuer une action d'affichage d'une alerte à l'utilisateur. Je le faisais de cette façon et j'ai trouvé un message qui dit qu'il pourrait même ne pas être exécuté. Comment puis-je structurer cela correctement.

func restoreIAPPurchases(completion: (() -> Void)) {
    if !self.canMakePayments {
        return
    }
    self.paymentQueue.restoreCompletedTransactions()
    completion()
}

let alertController = UIAlertController.vy_alertControllerWithTitle(nil, message:  "Restore will reprocess your existing subscription. You will not be charged", actionSheet: false)
    alertController.addAction("Ok")
    alertController.addActionWithTitle("Restore", style: .default) {
    IAPService.shared.restoreIAPPurchases {
       UIAlertController.vy_showAlertFrom(self, title: "Restore complete", message: "Successfully restored purchase")
     }
}
     alertController.presentFrom(self)


7 commentaires

plz après la méthode restoreCompletedTransactions.


il peut ne pas revenir à cause de if! self.canMakePayments {return} . Vous revenez et n'appelez pas le gestionnaire d'achèvement


@Bista est une fonction intégrée dans iOS que vous pouvez appeler


@Scriptable if! Self.canMakePayments {return} vérifie uniquement si un modèle d'appareil actuel prend en charge les paiements


peu importe ce qu'il vérifie ... il n'appelle pas l'achèvement. serait probablement mieux si la complétion était ((Bool) -> Void alors vous pourriez faire if! self.canMakePayments {completion (false) return} ou mieux ... < code> guard canMakePayments else {completion (false) return}


@Scriptable et quelle ligne ou où mettriez-vous completion (true) ?


Il existe des spécifiques fonctions qui sont appelées lorsque le processus de restauration est terminé. Ainsi que dans votre instruction if (qui serait plus agréable en tant que guard ), vous devez appeler votre gestionnaire de complétion à partir de ces deux rappels


3 Réponses :


0
votes

Le résultat est asynchrone ici

func paymentQueue(_ queue: SKPaymentQueue, 
restoreCompletedTransactionsFailedWithError error: Error)

ou

func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue)


4 commentaires

Cela ne sert à rien


ici, vous n'avez pas besoin d'une complétion, vous devez vérifier le résultat de la restauration avec les méthodes ci-dessus


Tout ce que je veux, c'est afficher un Si les achats ont été restaurés C'est tout. Je ne vois pas pourquoi je dois le faire de cette façon.


car ce processus est asynchrone pour contacter les serveurs Apple, insérez votre alerte succès / échec selon la méthode appelée ci-dessus



0
votes

Supposons que j'écris du code de connexion et que j'aie besoin d'un Hander d'achèvement pour attendre / rappeler une fois la demande terminée. / pre>

// MARK: - appelle la méthode de connexion avec le gestionnaire de complétion.

 func login(withViewControler viewController : UIViewController, completionHandler : @escaping (_ result : AnyObject?, _ error : NSError?) -> Void)  {
 // Write your logic here.       
}


0 commentaires

2
votes

"Je le faisais de cette façon et j'ai trouvé un message qui dit qu'il pourrait même ne pas être exécuté"

Il peut ne pas être exécuté car vous n'appelez pas le gestionnaire d'achèvement sur tous les chemins.

Comme Sh_Khan l'a mentionné dans sa réponse, vous n'avez pas vraiment besoin d'un gestionnaire de complétion ici, vous devez utiliser les méthodes de délégué pour être informé quand il se termine et s'il a réussi ou non. Mais votre problème particulier avec votre code spécifique est que vous n'appelez pas la complétion dans l'instruction if.

guard canMakePayments else {
    completion()
    return
} 

Cela devrait probablement être

XXX

Dans le code que vous aviez, si canMakePayments est faux, votre code de complétion ne s'exécutera pas.


0 commentaires