首页 > 解决方案 > Firebase iOS - 调用时数组为空

问题描述

当为我的数组调用我的侦听器时,它返回一个空数组而不是正确的元素,这是为什么呢?

模型:

    var friendList = [User]()
    var removeFriendListener: ListenerRegistration!

    func addFriendObserver(_ update: @escaping () -> Void) {
        removeFriendListener = CURRENT_USER_FRIENDS_REF.addSnapshotListener{ snapshot, error in
            self.friendList.removeAll()
            
            guard error == nil else {
                #if DEBUG
                    print("Error retreiving collection")
                #endif
                return
            }
            for document in snapshot!.documents {
                let id = document.documentID
                self.getUser(id, completion: { (user) in
                    self.friendList.append(user)
                })
            }
            
            update()
        }
    }

视图控制器:

    FriendSystem.system.addFriendObserver { () in
        FriendSystem.system.friendList.sort(by: {$0.username < $1.username})
        self.tableView.reloadData()
        print(FriendSystem.system.friendList)
    }

标签: iosswiftfirebasegoogle-cloud-firestore

解决方案


它看起来像这样:

func addFriendObserver(_ update: @escaping () -> Void) {
        removeFriendListener = CURRENT_USER_FRIENDS_REF.addSnapshotListener { snapshot, error in
            self.friendList.removeAll()
            
            guard error == nil else {
                #if DEBUG
                    print("Error retrieving collection")
                #endif
                return
            }
            
            let group = DispatchGroup()

            for document in snapshot!.documents {
                let id = document.documentID
                group.enter()
                self.getUser(id, completion: { (user) in
                    self.friendList.append(user)
                    group.leave()
                })
            }
            
            group.notify(queue: .main) {
                update()
            }
        }
    }

基本上,对于每个文档,一个块将进入该组,该块将一直保留到getUser完成。之后,当组完成时,它会通知你,这样你就可以确定你想要执行的所有事情都被执行了。

dispatchQueue编辑:因为未使用而被删除,我自己将它用于通知队列。


推荐阅读