Обновление Realm в реальном времени в UICollectionViewCell

ios
swift
uicollectionviewcell
realm
xcode

#1

Добрый вечер!
Помогите, пожалуйста, решить проблему с обновлением данных Realm и отображением их на экране.
У меня есть кастомная ячейка в UICollectionViewController, которая принимает данные из Realm и отображает их.
На этой ячейке есть кнопка, по нажатию на которую у меня должно уменьшаться число, находящееся в Realm. Изменения сразу должны попадать в Realm и отображаться на экране.
Все работает ровно до того момента, пока я не начинаю скроллить UICollectionView и не пытаюсь изменить следующее значение (например, значение второго объекта). Тогда начинается просто какая-то путаница и число меняется не в той ячейке, где я нажимаю кнопку, а в предыдущей.
Могу предположить, что так случается, потому что ячейки переиспользуются, но как решить это - не понимаю :sob:

Еще один вопрос в эту же тему: возможно ли как-то заменить reloadData() в collectionViewController на коллбэки от dataSource и delegate? Если да, то как? Посмотрела видео про коллбэки, но не понимаю как их использовать для обновления данных.

Надеюсь на вашу помощь :pray:

Код ячейки:

import UIKit

import RealmSwift

class StorefrontCell: UICollectionViewCell {

var product: Results<Product>!
let data = DataLoader().productInformation

@IBOutlet var name: UILabel!
@IBOutlet var price: UILabel!
@IBOutlet var quantity: UILabel!
@IBOutlet var buy: UIButton!

func configure(with productList: Product) {
    
    buy.layer.cornerRadius = 10
    buy.isHidden = false 
    name.text = "Наименование товара: \(productList.name)"
    price.text = "Цена: \(productList.price)"
    quantity.text = "Количество: \(productList.quantity)"
}

func configureNotAvailableProduct(with productList: Product) {
    buy.isHidden = true
    name.text = "Наименование товара: \(productList.name)"
    price.text = "Цена: \(productList.price)"
    quantity.text = "ТОВАРА НЕТ В НАЛИЧИИ"
}

@IBAction func buyAction(_ sender: UIButton) {
    
    product = realm.objects(Product.self)
    
    for result in product {
        
        let newQt = result.quantity - 1
        quantity.text = "Количество: \(newQt)"
        
        try! realm.write {
            result.quantity = newQt
        }
        if result.quantity == 0 {
            self.buy.isHidden = true
            self.quantity.text = "ТОВАРА НЕТ В НАЛИЧИИ"
        } else { return }
    }
}

}

Код CollectionView:

import UIKit
import RealmSwift

class StoreFrontViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout {

var product: Results<Product>!

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    collectionView.reloadData()
}

override func viewDidLoad() {
    super.viewDidLoad()
    product = realm.objects(Product.self)
    self.collectionView.register(UINib(nibName: "StorefrontCell", bundle: nil), forCellWithReuseIdentifier: "StorefrontCell")
}

// MARK: UICollectionViewDataSource

override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return product.count
}

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "StorefrontCell", for: indexPath) as! StorefrontCell
    
    
    let productInfo = product[indexPath.item]
    
    if productInfo.quantity != 0 {
        cell.configure(with: productInfo)
    } else {
        cell.configureNotAvailableProduct(with: productInfo)
    }
    
    return cell
}

// MARK: UICollectionViewDelegate

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: UIScreen.main.bounds.width - 10, height: UIScreen.main.bounds.width)
}

}