我尝试实现的是在从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()
}
}
}
}
1条答案
按热度按时间nkoocmlb1#
在完成处理程序中重新加载数据是解决我的问题的关键,但是,我还需要创建一个定制的设计单元格类,并对UITableView使用prepareForReuse