我有三个函数需要按如下顺序运行:
- 从 Firebase 收集整数,将它们放入数组中,然后计算总和。完成后...
- 从 Firebase 收集不同的整数值。完成后...
- 第三个函数获取函数 2 中的值,然后从函数 1 中减去该值。
我知道我需要使用完成处理程序,但需要一些语法等方面的帮助。
//第一个函数从 Firebase 获取整数并对它们求和:
func LoadPointsCompleted(completion: @escaping(_ sumOfPointsCompleted:Int) -> Int){
self.challengeList.removeAll()
databaseReference = Database.database().reference()
let userID = Auth.auth().currentUser?.uid
let refChallenges = Database.database().reference(withPath: "Challenges").child(userID!).queryOrdered(byChild: "Status").queryEqual(toValue: "Complete")
refChallenges.observeSingleEvent(of: .value, with: { (snapshot) in
//if the reference have some values
if snapshot.childrenCount > 0 {
//clearing the list
self.challengeList.removeAll()
//iterating through all the values
for Challenges in snapshot.children.allObjects as! [DataSnapshot] {
//getting values
let challengeObject = Challenges.value as? [String: AnyObject]
let Points = challengeObject?["Points"] as! Int
//creating challenge object with model and fetched values
let challenge = pointsModel(Points: (Points as Int?)!)
//appending it to list
self.challengeList.append(challenge)
let sumOfPointsCompleted = self.challengeList.reduce(0) {$0 + $1.Points}
let sumOfPointsCompletedString = String(sumOfPointsCompleted)
self.Calc_Earned.text = sumOfPointsCompletedString
completion(sumOfPointsCompleted)
}
}
}
)}
//第二个函数只是从 Firebase 中的另一个位置获取整数值
func loadPointsRedeemed(completion: @escaping (_ Points_Redeem: Int) -> Int) {
databaseReference = Database.database().reference()
let userID = Auth.auth().currentUser?.uid
databaseReference.child("Users").child(userID!).observe(DataEventType.value, with: { (snapshot) in
let value = snapshot.value as? NSDictionary
// let Points_Earn = value?["Points_Earned"] as? String ?? ""
let Points_Redeem = value?["Points_Redeemed"] as! Int
// self.Points_Earned.text = Points_Earn
let points_redeemedString = String(Points_Redeem)
self.Points_Redeemed.text = points_redeemedString
// let pointsRedeemedAs = Points_Redeem
completion(Points_Redeem)
// Do any additional setup after loading the view.
}
)}
//第三个函数只是获取前两个函数的值并减去它们
func BalanceOfPoints(){
let a = LoadPointsCompleted()
let b = loadPointsRedeemed()
let balance = a - b
let balanceString = String(balance)
self.Points_Balance.text = balanceString
}
但是,我在第三个函数“BalanceOfPoints”中遇到了一些错误,如下所示:
调用中参数“completion”缺少实参 - 插入“completion: <(Int) -> Int>”
当我第一次按照此处启动函数时,我不知道我的语法是否正确:
func LoadPointsCompleted(completion: @escaping(_ sumOfPointsCompleted:Int) -> Int){
还有...
func loadPointsRedeemed(completion: @escaping (_ Points_Redeem: Int) -> Int) {
有人可以帮忙吗?提前致谢。
最佳答案
LoadPointsCompleted
将闭包作为参数(完成处理程序)
你可以给它一个nil
完成处理程序
LoadPointsCompleted(completion: nil)
或者给它一个处理程序
LoadPointsCompleted() { sumOfPointsCompleted in
return <#some Int#>
}
但是 BalanceOfPoints
中的逻辑似乎有点偏离,因为 LoadPointsCompleted
和 loadPointsRedeemed
是同时按顺序调用的,而且实际上也没有调用返回 Int
,只有函数的完成处理程序才会返回。例如 completion(sumOfPointsCompleted)
可以更改为 let a = Completion(sumOfPointsCompleted)
但我确信这不是您想要的。
我会将这两个函数的签名更改为
func LoadPointsCompleted(completion: @escaping(_ sumOfPointsCompleted:Int) -> Void){
和
func loadPointsRedeemed(completion: @escaping (_ Points_Redeem: Int) -> Void) {
然后在BalanceOfPoints
中执行此操作
func BalanceOfPoints(){
LoadPointsCompleted() { sumOfPointsCompleted in
loadPointsRedeemed() { Points_Redeem in
let balance = sumOfPointsCompleted - Points_Redeem
let balanceString = String(balance)
self.Points_Balance.text = balanceString
}
}
}
但请注意,BalanceOfPoints
现在是一个异步函数。
不确定问题中的步骤 1 和 2 是否可以并行完成,但似乎可以并行完成,但正如这个答案所示,它们是按顺序进行的
关于ios - 使用完成处理程序按顺序执行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54033951/