编写完成处理程序的最佳方法是啥
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 程序中调试内存泄漏的最佳方法是啥?