编写完成处理程序的最佳方法是啥

Posted

技术标签:

【中文标题】编写完成处理程序的最佳方法是啥【英文标题】:What is the best way to write a completion handler编写完成处理程序的最佳方法是什么 【发布时间】:2019-01-17 13:11:08 【问题描述】:

我目前正在我的应用中实现应用内购买,在恢复购买后,我想调用完成以执行向用户显示警报的操作。我是这样做的,发现一个帖子说它甚至可能不会被执行。我怎样才能正确地构建它。

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)

【问题讨论】:

请发布 restoreCompletedTransactions 方法。 由于if !self.canMakePayments return ,它可能不会返回。您正在返回而不是调用完成处理程序 @Bista 它是一个内置的ios 函数,您可以调用 @Scriptable if !self.canMakePayments return 仅检查当前设备型号是否支持付款 检查什么都没关系...它不调用完成。如果完成是((Bool) -> Void 可能会更好,那么你可以做if !self.canMakePayments completion(false) return 或更好...guard canMakePayments else completion(false) return 【参考方案1】:

“我是这样做的,发现一个帖子说它甚至可能不会被执行”

它可能不会被执行,因为您没有在所有路径上调用完成处理程序。

正如 Sh_Khan 在他的回答中提到的那样,您实际上并不需要一个完成处理程序,您需要使用委托方法来通知它何时完成以及它是否成功。但是您的特定代码的特殊问题是您没有在 if 语句中调用完成。

if !self.canMakePayments 
    return

应该是

guard canMakePayments else 
    completion()
    return
 

在您拥有的代码中,如果 canMakePayments 为 false,那么您的完成代码将不会执行。

【讨论】:

【参考方案2】:

这里的结果是异步的

func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue)

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

【讨论】:

这没什么用 这里不需要补全,用以上方法检查恢复结果 我只想显示一个If purchases have been restored 就是这样。我不明白为什么我需要这样做。 因为这个过程是异步联系苹果服务器的根据上面调用的方法插入你的警报成功/失败【参考方案3】:

假设我正在编写登录代码,并且需要 Completion Hander 在请求完成后等待/回调。

//MARK:- @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.       

【讨论】:

以上是关于编写完成处理程序的最佳方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

在用 Actionscript 和 MXML 编写的 Flex 程序中调试内存泄漏的最佳方法是啥?

使用 JSON 协议处理版本控制的最佳方法是啥?

为 ASP.NET 编写月份和年份下拉列表的最佳方法是啥?

编写数据访问对象 (DAO) 的最佳方法是啥?

用嵌套字典编写这样一个条目的最佳、更实用的方法是啥?使用哪种设计模式? C#

避免在 pyspark 代码中使用 collect() 函数的最佳方法是啥?编写优化pyspark代码的最佳方法?