Как снять лайк с ячейки и показывать соответсвующее состояние

swift

#1

Всем привет!

У меня есть collectionView, ячейки выглядят примерно так:

Когда нажимаю на “лайк”, срабатывает функцияя:

@IBAction func buttonFavourite(_ sender: Any) {
    self.notAdded.isEnabled = false
    guard let userProfile = UserService.currentUserProfile else {
        print("error")
        return }

    let favRef = Database.database().reference().child("favourite").child("\(userProfile.uid)").childByAutoId()
    let favObject = [
            "gender" : favouriteArray?.gender,
            "imageOfClothes" : "\(favouriteArray!.imageOfClothes)",
            "name" : favouriteArray?.name,
            "price" : favouriteArray?.price,
            "type" : favouriteArray?.type
        ] as [String:Any]

    favRef.setValue(favObject) { (error, ref) in
        if error == nil {
            self.notAdded.isHidden = true
            self.added.isHidden = false
            self.notAdded.isEnabled = true
            print("okPost")
        } else {
            print("ne OK")
        }
    }
}

Простыми словами, просто копируется соответсвующая ячейка в раздел базы “favourite”
В другом контроллере у меня отображаются “лайкнутые” ячейки, тут срабатывает reference().observe:

func observeFavouriteClothes() {
    let favClothesRef = Database.database().reference().child("favourite").child((UserService.currentUserProfile?.uid)!)
    favClothesRef.observe(.value) { (snapshot) in
        var tempFav = [Clothes]()

        for child in snapshot.children {
            if let childSnapshot = child as? DataSnapshot,
            let dict = childSnapshot.value as? [String: Any],
                let name = dict["name"] as? String,
                let gender = dict["gender"] as? String,
                let price = dict["price"] as? Int,
                let type = dict["type"] as? String,
                let imageOfClothes = dict["imageOfClothes"] as? String,
                let url = URL(string: imageOfClothes) {

                let clothes = Clothes(name: name, price: price, imageOfClothes: url, gender: gender, type: type)
                tempFav.append(clothes)
            }
        }
        self.clothes = tempFav
        self.collectionView.reloadData()
        print("\(self.clothes)")
    }
}

Как можно удалить соответсвующую ячейку из базы, если буду нажимать на “снять лайк”. У меня две кнопки. Когда стоит лайк, скрывается кнопка “поставить” лайк. Вот не знаю что прописывать в функции дизлайка.
Плюс когда я перезахожу в контроллер, где находится список вещей (не контроллер “избранные”), лайки пропадают и я не знаю, как отображать соответсвующие данные соответствующего пользователя, чтобы показывало на что стоит лайк, а на что не стоит. Помогите, пожалуйста :slight_smile:

Заранее, огромное спасибо!


#2

Как по мне, так у вас все усложнено. Тут можно сделать все гораздо проще.
Во-первых, для кнопки лайка достаточно одного элемента, у которого просто будет меняться tintColor.
Во-вторых, в базе должны находиться данные только для авторизованного пользователя.
В-третьих, вам нужен какой-то идентификатор для ваших моделей одежды, с помощью него вы сможете проверять находится ли данная одежда в лайкнутых и если да, то помечаете кнопку.

По CoreData ничего не подскажу, т.к. не работал с ней.


#3

Тестирую сейчас по другому)
При лайке у меня сейчас отправляются данные одежды : ее название и значение true.
В том контроллере, где я хочу показать лайкнутые ячейки, я прогоняю по базе там, где установлено значение true и помещаю в массив filteredNames имена ячеек (name). Теперь я хочу получить из раздела базы Clothes/ (там находится вся одежда) все что находится с именами из массива filteredNames. Вот не знаю как такой запрос направить. Есть идеи? :slight_smile: