如何在完成处理程序中传递数据
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)
...
【讨论】:
以上是关于如何在完成处理程序中传递数据的主要内容,如果未能解决你的问题,请参考以下文章