Ios 编写完成处理程序的最佳方法是什么
我目前正在我的应用程序中实施应用内购买,在恢复购买后,我想调用完成来执行向用户显示警报的操作。我是这样做的,发现一个帖子说它甚至可能不会被执行。我怎样才能正确地构建这个Ios 编写完成处理程序的最佳方法是什么,ios,swift,closures,completionhandler,Ios,Swift,Closures,Completionhandler,我目前正在我的应用程序中实施应用内购买,在恢复购买后,我想调用完成来执行向用户显示警报的操作。我是这样做的,发现一个帖子说它甚至可能不会被执行。我怎样才能正确地构建这个 func restoreIAPPurchases(completion: (() -> Void)) { if !self.canMakePayments { return } self.paymentQueue.restoreCompletedTransactions()
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)
这里的结果是异步的
func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue)
或
假设我正在编写登录代码,需要完成处理程序在请求完成后等待/回拨 //标记:-@Properties
var signInCompletionHandler : ((_ result : AnyObject?, _ error : NSError?) -> Void)?
var viewController : UIViewController?
//MARK:-使用完成处理程序调用登录方法
func login(withViewControler viewController : UIViewController, completionHandler : @escaping (_ result : AnyObject?, _ error : NSError?) -> Void) {
// Write your logic here.
}
“我是这样做的,发现一篇帖子说它甚至可能不会被执行”
它可能不会执行,因为您没有在所有路径上调用完成处理程序
正如Sh_Khan在他的回答中提到的,这里并不需要一个完成处理程序,您需要使用委托方法来通知它何时完成以及是否成功。但是您的特定代码的特殊问题是您没有在if语句中调用completion
if !self.canMakePayments {
return
}
应该是
guard canMakePayments else {
completion()
return
}
在您拥有的代码中,如果canMakePayments为false,那么您的完成代码将不会执行 plz post restoreCompletedTransactions方法。它可能不会返回,因为
if!self.canMakePayments{return}
。您正在返回,但未调用完成handler@Bista这是一个内置的iOS
功能,您可以call@Scriptableif!self.canMakePayments{return}
仅检查当前设备型号是否支持付款,而不管它检查什么。。。这不是要求完成。如果完成是((Bool)->Void
可能会更好,那么您可以执行if!self.canMakePayments{completion(false)return}
或者更好…guard canMakePayments else{completion(false)return}
这没有帮助如果你不需要完成,你必须用上述方法检查恢复结果。如果购买已恢复,我只想显示一个,
仅此而已。我不明白为什么我需要这样做。因为这一过程与苹果服务器的联系是异步的,请插入成功/失败警报根据上面调用的方法
guard canMakePayments else {
completion()
return
}