Как улучшить прокрутку UITableView, когда данные рассчитываются на ходу в Swift? - PullRequest
0 голосов
/ 26 июня 2019

До изменений в способе, которым мы возвращаем ячейки в методе cellForRow:, я помню, что я смог бы проверить if cell == nil, и в основном у меня есть две отдельные области для настройки, связанной с ячейками (свойства, которые применяются ко всем ячейкам противтолько для некоторых).Однако с dequeueReusableCell: я не уверен, как справиться с этим и отложить его, пока я не смогу правильно заполнить все свои ячейки - но, по-видимому, за счет большого количества использования ЦП и памяти.Вот мой код в cellForRow: в настоящее время:

    if case (1...(days.count + 1), 2...(hours.count + 2)) = (indexPath.column, indexPath.row) {

            let cell = spreadsheetView.dequeueReusableCell(withReuseIdentifier: String(describing: ScheduleCell.self), for: indexPath) as! ScheduleCell

            let legs : NSArray = importedDict.object(forKey: "legs") as! NSArray

            print(hours![indexPath.row - 2])

            var profits : Array<Double> = []

            if let singleLegDict2 = legs as? [[String:AnyObject]] {

                print (singleLegDict2)
                for singleLegDict in singleLegDict2 {
                    let dict = singleLegDict as NSDictionary

                    let dateFormatter = DateFormatter()
                    dateFormatter.dateFormat = "yyyy-MM-dd"
                    let datee = dateFormatter.date(from: days![indexPath.column - 1] as! String)!
                    let datee2 = dateFormatter.date(from: dict.object(forKey: "expiry") as! String)!

                    let calendar = Calendar.current

                    // Replace the hour (time) of both dates with 00:00
                    let date1 = calendar.startOfDay(for: datee)
                    let date2 = calendar.startOfDay(for: datee2)

                    let components = calendar.dateComponents([.day], from: date1, to: date2)
                    let doub = Double(components.day!)

                    let years = doub * 0.00273972602

//                    let under : NSNumber = dict.object(forKey: "underlying") as! NSNumber
                    let strike : NSNumber = dict.object(forKey: "strikePrice") as! NSNumber
                    let interest1 : NSNumber = dict.object(forKey: "interest") as! NSNumber
                    var interest2 = interest1 as! Double
                    interest2 = interest2/100
                    let userIV : NSNumber = NSNumber(value: Double(dict.object(forKey: "userIV") as! String)!)
                    var userIV2 = userIV as! Double
                    userIV2 = userIV2/100

                    var type = 0
                    if dict.object(forKey: "putCall") as! String == "CALL" {
                        type = 0
                    } else {
                        type = 1
                    }

                    let theo = getTheoreticalOptionPrice(forUnderlyingPrice: hours![indexPath.row - 2] as! NSNumber, withStrike: strike, withInterestRate: NSNumber(value: interest2), withVolatility: NSNumber(value: userIV2), withTimeToExpirationInYears: NSNumber(value: years), withType: NSNumber(value: type))
                    let userC : NSNumber = NSNumber(value: Double(dict.object(forKey: "userCost") as! String)!)
                    let quan : NSNumber = dict.object(forKey: "quantity") as! NSNumber
                    let diff = (theo - (userC as! Double)) * (quan as! Double)
                    print(theo, (userC as! Double))
                    profits.append(diff)
                }

            }

            print(profits)

            var sumedArr : Double = profits.reduce(0, {$0 + $1}) as Double
            sumedArr = sumedArr * 100

            if sumedArr < 0 {
                cell.backgroundColor = UIColor(red: 0.8667, green: 0.1804, blue: 0.1804, alpha: 1.0)

            } else {
                cell.backgroundColor = UIColor(red: 0.3843, green: 0.7686, blue: 0.1608, alpha: 1.0)
            }

            cell.label.text = String(format: "%.0f", sumedArr)

            return cell
        }

Любые идеи о том, как ускорить это?Единственным способом будет предварительная загрузка данных и последующая ссылка на них только в cellForRow:?Как бы я решил эту ситуацию, учитывая вычисления, которые я делаю для каждой ячейки?

Мне не нужно, чтобы ячейки перезагружали свои данные каждый раз, когда их прокручивают.Если все ячейки загружают свои данные один раз, когда загружается представление, и эти данные только что отображались - это было бы идеально.

Имея это в виду, я попытался добавить проверку, чтобы увидеть, заполнена ли метка ячейки или нет, и только если нет, выполнить все эти вычисления (предполагая, что это будет первая загрузка представления таблицы).Хотя это улучшило производительность прокрутки, ячейки отображались некорректно и были полностью не в порядке.Справка?

Обновление: Я перенес тяжелые вычисления в фоновый поток и теперь испытываю плавную прокрутку.Тем не менее, ячейки все еще мерцают, потому что они все еще восстанавливают свои данные каждый раз, когда их показывают.Какой самый простой способ кэшировать ячейки, чтобы они загружались один раз, когда отображается tableView, а затем плавно прокручивались, потому что они ссылаются на уже загруженные данные?

Ответы [ 2 ]

1 голос
/ 26 июня 2019

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

Если вы зарегистрировали класс для указанного идентификатора и новой ячейки должен быть создан, этот метод инициализирует ячейку, вызывая ее Метод init (style: reuseIdentifier :). Для клеток на основе перьев этот метод загружает объект ячейки из предоставленного файла пера. Если существующая ячейка был доступен для повторного использования, этот метод вызывает метод prepareForReuse () вместо.

Таким образом, вы сможете различить оба случая и ответить соответственно.

0 голосов
/ 28 июня 2019

Использование JavaScriptCore для вычисления данных для каждой ячейки в cellForRow замедляло работу моего tableView без возможности исправления. Единственной альтернативой было предварительно кэшировать данные в массиве и затем отображать их. Однако для моего варианта использования это было невозможно.

Я переписал JavaScript в Swift, и прокрутка улучшилась.

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