Проблема производительности UITableView с HeaderCell - PullRequest
0 голосов
/ 09 сентября 2018

У меня проблема с производительностью, когда HeaderCell становится видимым, он занимает до 40% процессорного времени на iPhone X, и я вижу лаги. Этот UITableView отображает статические данные (телегид). Я вижу лаги каждый раз, когда я прокручиваю вверх и вниз, «tableView.dequeueReusableCell ()» не помогает. Если я использую свой ExpandableHeaderView () для создания HeaderCell для поддержки касания и расширения раздела, у меня та же проблема. Если развернуть раздел и прокрутить элементы внутри, я не вижу лагов. Проблема с производительностью возникает только когда HeaderCell появляется на экране. Когда пользователь открывает View Controller, он видит 3 программы для каждого канала (текущий и следующие две), если он нажимает на название раздела, он видит все программы для раздела (канала). HeaderCell содержит только метку. Я одинаково отображаю те же данные в своем приложении для Android, и они без проблем работают на простом устройстве Android.

func numberOfSections(in tableView: UITableView) -> Int {
        return Channels.count
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return Channels[section].Programs.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier)! as! TVGuideTableViewCell
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "HH:mm"
        let text = Channels[indexPath.section].Programs[indexPath.row].Name
        let dateString = dateFormatter.string(from:Channels[indexPath.section].Programs[indexPath.row].StartDate!)
        cell.label.text = text
        cell.timeLabel.text = dateString

        if (Channels[indexPath.section].Programs[indexPath.row].EndDate! < currentDate) {
            cell.label.textColor = UIColor.gray
        } else {
            cell.label.textColor = UIColor.white
        }

        if (Channels[indexPath.section].Programs[indexPath.row].StartDate! < currentDate) {
            cell.bell.isHidden = true
        } else {
            cell.bell.isHidden = false
        }

        if (Channels[indexPath.section].Programs[indexPath.row].EndDate! < currentDate) {
            Channels[indexPath.section].Programs[indexPath.row].expandedRow = false
        } else {
            if Channels[indexPath.section].expandedCount < 3 {
                Channels[indexPath.section].expandedCount += 1
                Channels[indexPath.section].Programs[indexPath.row].expandedRow = true
            }
        }

        return cell
    }

    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let headerCell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifierHeader) as! CustomHeaderTableViewCell
        headerCell.headerLabel.text = Channels[section].Name
        return headerCell
//        let header = ExpandableHeaderView()
//        header.customInit(title: Channels[section].Name, section: section, delegate: self as ExpandableHeaderViewDelegate)
//        return header
    }

    func toggleSection(header: ExpandableHeaderView, section: Int) {
        Channels[section].expanded = !Channels[section].expanded
        Channels[section].expandedCount = 0
        tableView.beginUpdates()
        for i in 0 ..< Channels[section].Programs.count {
            tableView.reloadRows(at: [IndexPath(row: i, section: section)], with: .automatic)
        }
        tableView.endUpdates()
    }

    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 38
    }

    func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
        return 2
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        if(Channels[indexPath.section].expanded) {
            return 38
        } else {

            if (Channels[indexPath.section].Programs[indexPath.row].EndDate! < currentDate) {
                return 0
            } else {
                if Channels[indexPath.section].Programs[indexPath.row].expandedRow {
                    return 38.0
                } else {
                    return 0.0
                }
            }

        }
    }

class CustomHeaderTableViewCell: UITableViewCell {


    @IBOutlet weak var headerLabel: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

1 Ответ

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

Из вашего кода я вижу, что проблема не в HeaderCell, проблема в DateFormatter объекте. Потому что каждый раз, когда вы прокручиваете ячейку, и появляется ячейка, создается новый объект, и просто представьте, что если есть 10-15 ячеек одновременно, то 10-15 повторно используются / создаются, и когда вы прокручиваете или перезагружаете данные, он снова создает новый объект.

Итак, я советую создать DateFormatter объект вне cellforRow, а затем просто использовать его, чтобы получить dateString, вызвав его.

Это только одно предположение, попробуйте это, и проект все еще появляется, дайте мне знать!

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