Правильная методология для фильтрации UICollectionView - PullRequest
0 голосов
/ 18 сентября 2018

Я только что реализовал механизм фильтрации в моем UICollectionView, и я думаю, что это неправильная методология, которую я должен был выбрать.

Как я могу улучшить свой код, чтобы он имел более высокую производительность?

У меня есть экран, на котором вы вводите свои критерии фильтрации, а затем этот код обрабатывает остальное:

extension ProductsCollectionViewController
{
    @objc func Filter()
    {
        performSegue(withIdentifier: "segue_to_filter_view", sender: self)
    }

    @IBAction func unwindFromFilterScreenAccept(segue: UIStoryboardSegue)
    {
        if segue.source is FilterViewController
        {
            if let senderVC = segue.source as? FilterViewController
            {
                if senderVC.chosenCategory != "" {categoryFilter = senderVC.chosenCategory}
                self.areFiltersSet = true
            }
        }

        self.tabBarController?.tabBar.isHidden = false

        self.products.removeAll()
        self.LoadProducts(productsToShow: pageType)
        //self.LoadProducts(productsToShow: pageType)

    }

    @IBAction func unwindFromClearAllFilters(segue: UIStoryboardSegue)
    {
        ClearAllFilters()
        self.products.removeAll()
        self.LoadProducts(productsToShow: pageType)
    }

    private func ClearAllFilters()
    {
        areFiltersSet = false
    }

    private func FilterProduct(prod: Product) -> Bool
    {
        if areFiltersSet == false {return true}
        return FilterProductByCategory(prod:prod) && FilterProductByLocation(prod:prod) && FilterProductByCondition(prod:prod)
    }

Также:

У меня реализована панель поиска.Будут ли оба работать вместе?Есть ли способ их правильной интеграции?

PS:

Сама фильтрация проверяется при добавлении товара в коллекцию при загрузке товара.

1 Ответ

0 голосов
/ 19 сентября 2018

Фильтрация путем выполнения перехода - не лучший способ.Будет лучше обновить сам collectionView в зависимости от выбранного фильтра.Например, если у вас есть продукты, которые соответствуют определенной категории, вы можете просто сделать что-то вроде:

let products = [Product(category: "one"), Product(category: "one"), Product(category: "two")]
let foo = products.filter {$0.category == "one"}

, эта функция фильтра будет возвращать только продукты, которые соответствуют первой категории.Затем вы можете просто использовать отфильтрованный массив для заполнения collectionView.

О панели поиска, да, они будут работать вместе с любой другой функцией фильтра.По сути, вы просто выполните два фильтра:

  1. На основе свойства категории
  2. На основе введенной вами подстроки

Только для дальнейшего использования, еслиВы добавляете searchBar в качестве collectionViewCell или в качестве заголовка, вам придется перезагрузить элементы с помощью indexPaths, потому что reloadData() оставит ответчика в строке поиска.

Еще одна вещь, так же как предложение, это обычная практика, когда ваши методы называются строчными -> filter () вместо Filter ().

...