Определите людей, которым пользователь следует в TableView Swift - PullRequest
0 голосов
/ 10 февраля 2020

В моем приложении реализован поиск пользователей, который показывает всех пользователей и рядом с каждым пользователем отображается кнопка следования. Если текущий зарегистрированный пользователь уже следует за пользователем в ячейке, я хочу изменить отображение и текст кнопки в ячейке. Я нашел крайне неэффективное решение, которое, как я полагаю, вызовет серьезные проблемы в масштабе, то есть каждый раз, когда я строю ячейку до 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)
                    }
                   }
               }

           })

}

1 Ответ

0 голосов
/ 08 марта 2020

По совету @Jay я создал массив на родительской вкладке, а затем получил доступ к этому массиву из моего SearchUsersViewController со следующим:

let tbvc = self.tabBarController  as! CustomTabBarController
follows = tbvc.follows

    for person in follows {
        //Check if the person in the followers array matches the current row
        if person == users[indexPath.row].userUid {
            print("PERSON - \(person) USER - \(users[indexPath.row].userUid)")
            isFollowing = true
        }
    }

И я передал переменную isFollowing в моя configureCell функция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...