ios - 使用完成处理程序按顺序执行操作

标签 ios swift function firebase completionhandler

我有三个函数需要按如下顺序运行:

  1. 从 Firebase 收集整数,将它们放入数组中,然后计算总和。完成后...
  2. 从 Firebase 收集不同的整数值。完成后...
  3. 第三个函数获取函数 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 中的逻辑似乎有点偏离,因为 LoadPointsCompletedloadPointsRedeemed 是同时按顺序调用的,而且实际上也没有调用返回 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/

相关文章:

python - 迭代变量参数的元素

r - 在 R 的 scales 包中,为什么 trans_new 使用反参数?

ios - UIDatePicker 内存泄漏与 ARC

ios - 如何快速获取我的 gmail 联系人列表的电子邮件地址

ios - 根据 CollectionView 中的选择更改 ImageView

ios - 尝试通过 In-App Purchase 快速购买第二件商品时出现错误?

android - 对于Android 3的处理,registerReceiver和getApplicationContext函数不存在

ios - 为什么 iOS 模拟器在实际启动屏幕出现之前会出现白屏

ios - AVCaptureSession 在 iPad 上工作正常但在 iPhone 上不行

ios - AVPlayer 多次播放视频(10-15)得到带有十字线的播放图标