ios 在完成处理程序中添加数据后显示为空的全局数组(Swift)

qfe3c7zg  于 2023-01-22  发布在  iOS
关注(0)|答案(1)|浏览(114)

我尝试实现的是在从GoogleFirestore检索到所有数据并将其设置为全局数组之后,加载一个包含用户的UITableView(self.activeUsers)。在闭包内部,我可以看到数组正确地添加了元素,但当我尝试在其他任何地方使用此全局变量时(例如在viewdidload()方法中)它将其显示为空数组。我是Swift的新手,所以我知道这里有一些愚蠢的东西我不理解,可能是异步调用或完成处理。我觉得这里有很多代码可以忽略,因为我知道总体问题是我的全局变量self。activeUsers在viewDidLoad中不包含任何数据,但是,我可以看到它在fetchActiveUsers()中被正确设置

override func viewDidLoad() {
        super.viewDidLoad()

        let myCompletionHandler: () -> Void = {
            print("Count in viewDidLoad: ", self.activeUsers.count) // activeUsers count is 0 here. But why?
            self.loadActiveUsersTableView()
        }
        fetchActiveUsers(using: myCompletionHandler)
    }

    func loadActiveUsersTableView() {
        self.view.addSubview(activeUsersTableView)
        self.activeUsersTableView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate(
            [
                self.activeUsersTableView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 150),
                self.activeUsersTableView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 30),
                self.activeUsersTableView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -280),
                self.activeUsersTableView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -250),
            ]
        )
        self.activeUsersTableView.reloadData()
    }

    func fetchActiveUsers(using completionHandler: @escaping () -> Void) {
        let myCompletionHandler: (UserProfile?) -> Void = { theUser in
            self.activeUsers.append(theUser!)
            print("Count in fetchActiveUsers myCompletionHandler", self.activeUsers.count) // Able to see this increment correctly after adding a user
        }
        self.chatsDocRef!.getDocument { document, error in
            if let error = error as NSError? {
                print("Error getting document: \(error.localizedDescription)")
            }
            else {
                if let document = document {
                    let data = document.data()
                    self.activeUserUIDS = data?["users"] as? [String]
                    for i in 0..<(self.activeUserUIDS?.count ?? 0) {
                        print("Retrieving document for user ID: ", self.activeUserUIDS![i])
                        let userDocRef = Firestore.firestore().collection("users").document(self.activeUserUIDS![i])
                        UserProfile.getUserProfileData(userDocRef, using: myCompletionHandler)
                    }
                    completionHandler()
                }
            }
        }
    }
nkoocmlb

nkoocmlb1#

在完成处理程序中重新加载数据是解决我的问题的关键,但是,我还需要创建一个定制的设计单元格类,并对UITableView使用prepareForReuse

相关问题