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@Scriptable
if!self.canMakePayments{return}
仅检查当前设备型号是否支持付款,而不管它检查什么。。。这不是要求完成。如果完成是
((Bool)->Void
可能会更好,那么您可以执行
if!self.canMakePayments{completion(false)return}
或者更好…
guard canMakePayments else{completion(false)return}
这没有帮助如果你不需要完成,你必须用上述方法检查恢复结果。如果购买已恢复,我只想显示一个
仅此而已。我不明白为什么我需要这样做。因为这一过程与苹果服务器的联系是异步的,请插入成功/失败警报根据上面调用的方法
guard canMakePayments else {
    completion()
    return
}