Arhn - архитектура программирования

Задержка просмотра таблицы (даже после удаления распознавателей жестов)

В настоящее время у меня есть представление таблицы, которое отстает при наличии нескольких ячеек. Когда есть только одна ячейка, она работает плавно; однако, когда заполнено несколько ячеек, табличное представление кажется медленным, иногда прерывистым и не таким плавным. Я удалил распознаватели жестов и вместо этого изменил его на didSelectRowAt, однако в ячейках все еще есть отставание. Вот код для загрузки ячеек:

  public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if queryComplete == true {
        if displayConvo == true {
            let cell = tableView.dequeueReusableCell(withIdentifier: "messageCell", for: indexPath as IndexPath)  as! messageTableViewCell
            cell.profileImage.image = nil
            cell.selectionStyle = UITableViewCell.SelectionStyle.none

            var convoContent: messagesViewController.Convo
            convoContent = convoList[indexPath.row]

            convoContent.itemHeroID = "\(String(describing: convoContent.convoID))"
            cell.name.heroID = "\(String(describing: convoContent.convoID))"
            cell.lastMessage.text = convoContent.lastMessage
            cell.backgroundColor = UIColor.clear
            cell.postText.text = convoContent.postContent

            if convoContent.revealedBool == true {
                cell.profileImage.isHidden = false
                cell.profileImage.heroID = "\(String(describing: convoContent.convoID))"
                cell.name.text = convoContent.name
                cell.timer.isHidden = true
                if convoContent.profileImage == "nil" || convoContent.profileImage == nil {
                    let url =  URL(string:"https://firebasestorage.googleapis.comasdjfjaisfdji")
                    let processor = RoundCornerImageProcessor(cornerRadius: cell.profileImage.frame.size.width / 2)
                    cell.profileImage.kf.setImage(with: url, placeholder: nil, options: [.processor(processor)])
                }

                else {
                    let url = URL(string: convoContent.profileImage!)
                    let processor = RoundCornerImageProcessor(cornerRadius: cell.profileImage.frame.size.width / 2)
                    cell.profileImage.kf.setImage(with: url, placeholder: nil, options: [.processor(processor)])

                }
            }

            else {
                cell.profileImage.isHidden = true
                cell.timer.isHidden = false
                cell.timer.isUserInteractionEnabled = false
                cell.timer.heroID = "\(String(describing: convoContent.convoID))"
                let postDuration = convoContent.timeOfDeletion! - Int(convoContent.time!)
                let currentTime =  Date().timeIntervalSince1970 * 1000
                let difference = Int(round(Double(convoContent.timeOfDeletion! - Int(currentTime))))
                let date = Date(timeIntervalSinceNow: TimeInterval(difference / 1000))
                cell.name.text = String(timeToDelete(date: date as NSDate, numericDates: false))

                let amountOfCircleCovered = (Double(((convoContent.timeOfDeletion!) - Int(currentTime))) / Double(postDuration)) * 100
                var timerColor: UIColor?
                switch amountOfCircleCovered {
                case 0..<30:
                    timerColor = UIColor (red: 252/255, green: 110/255, blue: 81/255, alpha: 1)
                case 30..<60:
                    timerColor = UIColor (red: 255/255, green: 215/255, blue: 0/255, alpha: 1)
                case 60..<100:
                    timerColor =  UIColor(red: 26/255, green: 152/255, blue: 252/255, alpha: 1.0)
                default:
                    timerColor =  UIColor(red: 26/255, green: 152/255, blue: 252/255, alpha: 1.0)
                }
                print(amountOfCircleCovered)
                cell.timer.models = [   PieSliceModel(value: Double(100 - amountOfCircleCovered), color: UIColor(red: 220/255, green: 220/255, blue: 220/255, alpha: 1)),
                                        PieSliceModel(value: Double(amountOfCircleCovered), color: timerColor!),
                ]

            }
            let lastMessageDate = Date(timeIntervalSince1970: TimeInterval(convoContent.timeOfLastMessage! / 1000))
            cell.timeOfLastMessage.text = String(timeAgo(date: lastMessageDate as NSDate, numericDates: false))
            return cell

            }
        else {
            let cell = tableView.dequeueReusableCell(withIdentifier: "messageCell", for: indexPath as IndexPath)  as! messageTableViewCell

            cell.lastMessage.text = "No new messages"
            return cell
            }
    }
    else {
        let cell = tableView.dequeueReusableCell(withIdentifier: "messageCell", for: indexPath as IndexPath)  as! messageTableViewCell
        print ("loading")
        return cell
    }
}

Кроме того, я попытался переместить некоторые аспекты ячейки, чтобы их можно было каждый раз сбрасывать, помещая их в файл ячейки:

override func awakeFromNib() {
    super.awakeFromNib()

    profileImage.cornerRadius = profileImage.frame.size.width / 2
    profileImage.clipsToBounds = true
    profileImage.layer.borderColor = UIColor.white.cgColor
    profileImage.layer.borderWidth = 1

    timer.innerRadius = 0
    timer.outerRadius = timer.frame.width / 2
    timer.animDuration = 0.0
    timer.referenceAngle = 270
    timer.backgroundColor = UIColor.white
    postText.layer.zPosition = 1

    if !UIAccessibility.isReduceTransparencyEnabled {
        glossyView.backgroundColor = .clear

        let blurEffect = UIBlurEffect(style: .regular)
        let blurEffectView = UIVisualEffectView(effect: blurEffect)
        //always fill the view
        blurEffectView.frame = self.glossyView.bounds
        blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

        glossyView.addSubview(blurEffectView) //if you have more UIViews, use an insertSubview API to place it where needed
    } else {
        glossyView.backgroundColor = .black
    }

    timer.selectedOffset = 0
    glossyView.clipsToBounds = true
    glossyView.cornerRadius = 12.0
    glossyView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]

    messageBackground.clipsToBounds = true
    messageBackground.cornerRadius = 12.0
    messageBackground.layer.maskedCorners = [.layerMinXMaxYCorner, .layerMaxXMaxYCorner]
  //  glossyView.roundCornersView(corners: [.topLeft, .topRight], radius: 12.0)
   // messageBackground.roundCornersView(corners: [.bottomLeft,.bottomRight], radius: 12.0)
    // Initialization code
}

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

override func prepareForReuse() {
    profileImage.image = nil
    timer.isHidden = true
    timer.models = []

}

}

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


  • К распознавателям жестов отношения не имеет. Вы тратите слишком много времени на cellForRow, или перегружаете дерево рисования слоев, или и то, и другое. 13.03.2019
  • @matt Не могли бы вы уточнить? Как я могу сократить время для cellForRow или уменьшить количество слоев? Я все еще хотел бы иметь тот же дизайн с глянцевыми видами и анимацией таймера и тому подобным, и логика все еще необходима, поэтому я не уверен... 14.03.2019
  • Инструменты предоставляют вам мощные инструменты для анализа анимаций прокрутки с заиканием. У Apple есть много видео WWDC на эту тему. Смотреть их! 14.03.2019
  • @matt Глядя на профилирование времени, выясняется, что CA Layer Display Quartz Core занимает 1,27 секунды и 19% веса. Означает ли это, что рисунки в ячейках вызывают отставание? PieSliceModel (значение: Double (100 – сумма кругового покрытия), цвет: UIColor(red: 220/255, green: 220/255, blue: 220/255, alpha: 1)), PieSliceModel(value: Double(amountOfCircleCovered), color: timerColor!), 14.03.2019
  • @matt также показывает, что слой пирога занимает 18,3% веса. Как я могу сохранить эти анимированные таймеры без задержки? 14.03.2019
  • @matt, было бы неплохо просто загрузить кучу разных изображений частично заполненных кругов, а затем загрузить эти изображения вместо таймера? 14.03.2019

Ответы:


1

По сути, пользовательский интерфейс резко снижал производительность. Я переключил CA Layer времени пирога для изображений png с частично заполненными кругами и удалил все анимации героев. В результате и приложение, и табличное представление стали более плавными.

14.03.2019
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..