Как UICollectionView обновляет ячейки? - PullRequest
0 голосов
/ 01 мая 2020

Я создаю приложение, которое отслеживает пакеты. Каждая ячейка в UICollectionView содержит имя пакета и статус доставки пакета. Мой источник данных для представления коллекции - это массив элементов.

Класс Item выглядит примерно так:

class Item {
    var name: String
    var carrier: String 
    var trackingNumber: String 
    var status: String //obtained via API get request at some point after initialization 
}

Я хотел бы реализовать две функции: возможность добавлять элемент (и впоследствии запускать обновление для всех элементов) и возможность просто вызвать обновление для всех элементов. Вот как выглядит мой ViewController:

class PackagesController: UICollectionViewController, UICollectionViewDelegateFlowLayout {
    var items: [Item]? 
    override func viewDidLoad() {super.viewDidLoad()}
    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return items.count
    }
    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        //return an item cell 

        //Is this where I should make the API request? 

    }
}

Мои вопросы:

  1. Где я должен сделать запрос API (максимально КПД)?

  2. Как я могу обновить всю информацию об элементах по запросу пользователя (не уверен, что перебор массива элементов приведет к перезагрузке представления коллекции)?

  3. Есть ли что-то не так с тем, как мой код в настоящее время структурирован, или есть лучший способ организовать мой код для желаемых целей?

1 Ответ

0 голосов
/ 01 мая 2020

Ваш написанный код выглядит до сих пор в основном нормально.

Некоторые изменения, которые я бы порекомендовал:

  • Item должен быть структурой, а не классом, и его члены должны быть постоянными (let), если вы не очень хорошо и указывает c причины в противном случае.
  • "полученный через API запрос на получение в какой-то момент после инициализации" звучит так, как будто это необязательно (String?)

Это где я должен сделать запрос API?

Нет. Никогда не выполняйте сетевые запросы или что-либо сложное в cellForItemAt. Просто получите соответствующую запись из вашего источника данных (т.е. из вашего массива элементов) и заполните ячейку этим.


func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    // get a cell
    let cell = collectionView.dequeueResuableCell(withIdentifier: "yourCellIdentifier", indexPath: indexPath) as! YourCellClass
    // get the data
    let item = self.items[indexPath.row]
    // populate the cell with the data
    cell.setup(with: data) // you need to implement this in your cell

    return cell
}

Как я могу обновить всю информацию об элементах по запросу пользователя

Сделайте соответствующий сетевой запрос / вычисления или все, что необходимо, и, как только вы получите результат, перезапишите ваш массив items и вызовите reloadData() в CollectionView. Поместите это в метод, который вы можете вызвать, например, как действие нажатия кнопки, и, конечно, когда изначально отображается представление вашей коллекции.

...