Swift 我的完成处理程序总是返回一个空数组,为什么?

Swift 我的完成处理程序总是返回一个空数组,为什么?,swift,firebase,Swift,Firebase,我有下面的函数,它从Firebase获取数据,填充一个恭维数组,并假设通过完成处理程序将数组传递回 返回的数组始终为空,即使向其中添加了对象 如果我将完成处理程序代码放置在错误的位置,我尝试在所有大括号中插入,但没有任何效果 HandlerCompaids处的断点,true执行行输出以下内容: 0x0000000102bb3fe8 vipeeps`partial apply forwarder for closure #1 (Swift.Array<Any>, Swift.Bool)

我有下面的函数,它从Firebase获取数据,填充一个恭维数组,并假设通过完成处理程序将数组传递回

返回的数组始终为空,即使向其中添加了对象

如果我将完成处理程序代码放置在错误的位置,我尝试在所有大括号中插入,但没有任何效果

HandlerCompaids处的断点,true执行行输出以下内容:

0x0000000102bb3fe8 vipeeps`partial apply forwarder for closure #1 (Swift.Array<Any>, Swift.Bool) -> () in vipeeps.ConversationsListVC.loadNewInvitesData() -> () at ConversationsListVC.swift
数据结构:


您可能希望使用分派组,在所有异步observeSingelEvent调用完成后,将对分派组进行Notified:

在观察代码中,创建一个新的DispatchGroup 在调用async observeSingleEvent之前,请输入组。 在asyc关闭结束时,您离开该组 一旦所有输入和离开调用匹配,就会调用notify,然后调用处理程序 请看这里:

func getComplimentsReceived(forUserId forId: String, handler: @escaping (_ complimentPack: [Any] ,_ success: Bool) -> ()){
    REF_USERS_COMPLIMENTS.child(forId).observe(.value) { (snapshot) in
        var compliments = [Any]()//empty array to hold compliments
        let dispatchGroup = DispatchGroup()
        for item in snapshot.children {

            for (key, status) in dict {

                switch status {
                    case true:
                        dispatchGroup.enter()
                        self.REF_USERS.child(snapshot.key).observeSingleEvent(of: .value, with: { (snapshot) in
                            // ...
                            compliments.append(complimentPack)
                            dispatchGroup.leave()
                    })//end observer
                    case false:
                        print(status)
                        break

                }//end switch

            }//end for dict

        } //end for snapshot.item

        dispatchGroup.notify(queue: .main) {
            handler(compliments, true)
        }
    } //end observe

}//end func
@Roggie添加编辑功能:

func loadNewInvitesData(){


    guard let uid = Auth.auth().currentUser?.uid else { return }

    DataService.run.getInvitesAndCompliments(forUserId: uid) { (array, sucess) in


            for item in array {
                let user = item ["fromUser"] as! User
                let uid = user.uid
                print("user id: \(uid)")
                DataService.run.observeUser(forUserId: uid, handler: { (user) in
                    self.users.append(user)
                })
            }
        self.invites = array
        self.collectionView.reloadData()

    }

}//end func

此代码无论如何都无法按预期工作,因为您调用了最终的处理程序。。调用内部异步闭包之前的语句。顺便问一下:尽管您清楚地知道更具体的是[[String:Any]],但为什么要将恭维和数组参数声明为unspecified[Any]??闭包的Swift 3+语法是@escaping[Any],Bool->不带下划线和参数标签。从内部调用处理程序“end observe”scope not inside“end for snapshot.item”scope并重试!谢谢@vadian我已经做了你建议的更改。谢谢@vivekDas尝试了,但仍然没有成功:我用最新的代码编辑了我的问题。observeSingleEvent异步工作。循环立即执行,处理程序。。就计算机速度而言,在第一次关闭通过快照之前需要很长时间。感谢您的建议,我将尝试此方法并向您报告。是的-此方法有效-非常感谢您的帮助,@vadianI知道这可以追溯到一点,但我要求self.REF_USERS.childsnapshot.key.observe而不是observeSingleEvent,但由于它在Firebase上发生更改时再次执行关闭,因此发生了崩溃,因为我认为enter和leave已关闭。如果删除所有dispatchGroup代码,则不会读取所有节点。你建议我怎么做?如果你想用observe而不是observeSingleEvent,你必须重新考虑你的程序逻辑。正如您已经发现的,第一个将在任何时候发生修改时调用。因此,您只能尝试更新此处的UI add/remove/delete,而不能尝试返回所有对象的数组。也许您可以在现有observeSingleEvent的基础上添加observeSingleEvent,并在其中执行更新操作,例如,不涉及任何dispatchGroup。感谢您的反馈,上述函数将返回一个字典数组,其中包含获取的用户uid,然后,我尝试循环使用uid,并将观察用户添加到单独的用户数组中,以用于UI显示,但我发现在重新加载CollectionView时出现了索引越界错误…请参阅上面的附加编辑。
func loadNewInvitesData(){


    guard let uid = Auth.auth().currentUser?.uid else { return }

    DataService.run.getInvitesAndCompliments(forUserId: uid) { (array, sucess) in


            for item in array {
                let user = item ["fromUser"] as! User
                let uid = user.uid
                print("user id: \(uid)")
                DataService.run.observeUser(forUserId: uid, handler: { (user) in
                    self.users.append(user)
                })
            }
        self.invites = array
        self.collectionView.reloadData()

    }

}//end func