В моем приложении реализован поиск пользователей, который показывает всех пользователей и рядом с каждым пользователем отображается кнопка следования. Если текущий зарегистрированный пользователь уже следует за пользователем в ячейке, я хочу изменить отображение и текст кнопки в ячейке. Я нашел крайне неэффективное решение, которое, как я полагаю, вызовет серьезные проблемы в масштабе, то есть каждый раз, когда я строю ячейку до l oop через последователей текущего пользователя и проверяю, совпадает ли userid
ячейки с одним из userids
в последователи. Вот как этот код выглядел в моей configureCell()
функции.
let currentUserFollowers = DataService.ds.REF_USERS.child("\(uid!)").child("follows")
currentUserFollowers.observe(.value, with: { (snapshot) in
self.follows = []
if let snapshot = snapshot.children.allObjects as? [DataSnapshot] {
for snap in snapshot {
print("SNAP USER - \(snap.key)")
if snap.key == user.userUid {
self.followButton.backgroundColor = .green
self.followButton.setTitle("Following", for: .normal)
}
}
}
})
Я не думаю, что это отличное долгосрочное решение. Итак, моей другой мыслью было запустить эту функцию в другом месте и создать массив userids
, которым следует текущий пользователь. Проблема заключалась в том, что ячейки были построены до того, как асинхронный вызов Firebase завершил сборку массива, поэтому у меня не было доступа к этим значениям в массиве.
func getCurrentUserFollowers () {
let currentUserFollowers = DataService.ds.REF_USERS.child("\(uid!)").child("follows")
currentUserFollowers.observe(.value, with: { (snapshot) in
self.follows = []
if let snapshot = snapshot.children.allObjects as? [DataSnapshot] {
for snap in snapshot {
print("SNAP USER - \(snap.key)")
self.follows.append(snap.key)
print("SELF FOLLOWS - \(self.follows)")
//let postData = DataService.ds.REF_POSTS.child(snap.key)
/*postData.observe(.value, with: { (snapshot) in
if let postDict = snapshot.value as? Dictionary<String, AnyObject> {
let key = snapshot.key
let post = Post(postKey: key, postData: postDict)
//self.posts.append(post)
}
//self.feedTableView.reloadData()
})*/
}
}
})
}
И вызвал его здесь:
override func awakeFromNib() {
super.awakeFromNib()
getCurrentUserFollowers()
//isFollowing = false
// Initialization code
}
Я думаю, что правильный подход - создать массив один раз, а затем использовать его при настройке ячеек. Это лучший подход? Если так, как я могу заполнить массив до начала configureCell()
? Структура данных выглядит следующим образом:
"users" : {
"0hyN8N2klJWqPi2lkRqNK3vg7z63" : {
"followers" : {
"26OUuaRZEVWUmkLJp13LzirGbs13" : true,
"gQpktBMh97hTqiysHBwvVLZl70y1" : true
},
"follows" : {
"26OUuaRZEVWUmkLJp13LzirGbs13" : true,
"gQpktBMh97hTqiysHBwvVLZl70y1" : true
},
"posts" : {
"-Ly6ciYHm7v5JFy1VmVY" : true,
"-Ly6cyLukI6aRRki5yna" : true
},
"provider" : "Firebase"
}
РЕДАКТИРОВАТЬ: Как @Jay указал ниже, мне нужно построить массив и затем перейти к V C, который управляет видом таблицы. Я думаю, мне нужно что-то вроде этого:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let barViewControllers = segue.destination as! UITabBarController
let destinationViewController = barViewControllers.viewControllers![3] as! SearchUsersViewController
destinationViewController.follows = follows
}
func observeUsersFollowed() {
print("FOLLOWS ARRAY - \(follows)")
let currentUserFollowers = DataService.ds.REF_USERS.child("\(uid!)").child("follows")
currentUserFollowers.observe(.value, with: { (snapshot) in
self.follows = []
if let snapshot = snapshot.children.allObjects as? [DataSnapshot] {
for snap in snapshot {
print("SNAP USER - \(snap.key)")
if snap.key == self.user.userUid {
self.follows.append(self.user.userUid)
}
}
}
})
}