【问题标题】: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 参数成为可选参数,并且可能使用错误参数,以防出现错误以在所有情况下调用完成。

标签: ios swift closures completionhandler


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2017-10-07
    • 2017-11-13
    相关资源
    最近更新 更多