如何在完成处理程序中传递数据

Posted

技术标签:

【中文标题】如何在完成处理程序中传递数据【英文标题】:How to pass data in completion handler 【发布时间】:2019-02-06 09:47:40 【问题描述】:

我正在尝试将 IAP 收据传递给包含用户的 completion handler,并希望通过在我收到的其他一些 class 中调用它来检查用户 subscription 当前是否处于活动状态。我该如何解决这个问题。

不能调用非函数类型的值'((Student) -> Void)?'

func validateReceipt(pReceiptData: Data? = nil, completion pCompletion: ((Student) -> Void)? = nil) 
    let receiptData = pReceiptData!.base64EncodedString()
    let receiptDict: [String: Any] = ["receipt-data": receiptData]
    do 
        let data = try JSONSerialization.data(withJSONObject: receiptDict)
        guard let validationUrl = URL(string: "https://us-central1-myApp-a8e27.cloudfunctions.net/receiptValidation") else  return 
        let session = URLSession(configuration: .default)
        var request = URLRequest(url: validationUrl, cachePolicy: .reloadIgnoringLocalCacheData)
        request.httpMethod = "POST"
        request.httpBody = data
        let task = session.uploadTask(with:request, from: data)  (data, response, error) in
            guard let data = data, error == nil else  return 
            do 
                let receipt = try IAPReceipt.decode(data: data)
                pCompletion(receipt)

             catch let error 
                print(error.localizedDescription)
            
        
        task.resume()
     catch let error 
        print(error)
    

【问题讨论】:

不相关,但为什么pReceiptData 是可选的nil 默认值,尽管无论如何它都会被强制解包。这没有任何意义。 @vadian 也可以将默认值设置为空闭包 然后他可以避免可选参数 @vadian 是因为我只在当前调用的调用中需要它。我在其他地方不需要它,因此不会使用它,因此将其设为可选并将其默认为 nil pCompletion 是可选的,所以至少应该是pCompletion?(receipt),不是吗?此外,我倾向于使闭包的 Student 参数成为可选参数,并且可能使用错误参数,以防出现错误以在所有情况下调用完成。 【参考方案1】:

您可以使用typealias 使您的函数声明更简洁。并看看完成块是如何制作的。

typealias Completion = ((_ student: Student) -> Void)?
func validateReceipt(pReceiptData: Data? = nil, completion: Completion = nil) 
      ...  

【讨论】:

以上是关于如何在完成处理程序中传递数据的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序不跳转页面传递数据

如何从 Java Activity 传递数据以响应本机?

如何将数据从中间件传递到处理程序?

如何用MapReduce程序对采集到的数据进行预处理?

Android如何在Activity和Service之间传递数据

react中前后台传递数据时如何传递字符串