TableView с задержкой при медленной прокрутке - PullRequest
0 голосов
/ 24 мая 2018

У меня проблема с плавной прокруткой на моем UITableViewCell.Когда я медленно прокручиваю UITableView, я получаю 30-40 FPS, и мои ячейки прыгают (сначала сверху, а затем снизу).

Когда я быстро прокручиваю, я получаю 55-60 FPS, клетки не 'прыгаю и все хорошо.

FPS был измерен с помощью профиля.

Также, когда я прокручиваю, загрузка процессора составляет ~ 15-25%

Я использую UIStoryboard для создания ячейки, Realm DB и UITableViewAutomaticDimension

Вот мой UITableView Код:

 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let stop = getStop(indexPath: indexPath)
    let cell = tableView.dequeueReusableCell(withIdentifier: "stop", for: indexPath) as! StopTableViewCell
    cell.configure(model: stop)
    return cell        
 }

Вот код клетки:

class StopTableViewCell: UITableViewCell {


@IBOutlet weak var status: UILabel!
@IBOutlet weak var number: UILabel!
@IBOutlet weak var date: UILabel!
@IBOutlet weak var name: UnderLinedLabel!
@IBOutlet weak var address: UnderLinedLabel!
@IBOutlet weak var phone: UnderLinedLabel!
@IBOutlet weak var milage: UILabel!


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

override func prepareForReuse() {
    super.prepareForReuse()
    name.text = nil
    address.text = nil
    phone.text = nil
    milage.text = nil
    number.text =  nil
    date.text = nil
}

func calculateEstimateRoute(to lat: Double, lon: Double) -> String {
    let distance = LocationManager.Instance.actualLocation.distance(from: CLLocation(latitude: lat, longitude: lon))
    let isMetric = NSLocale.current.usesMetricSystem
    let measurment = Measurement(value: distance, unit: UnitLength.meters)
    var estimateRoute = !isMetric ? measurment.converted(to: UnitLength.miles) : measurment.converted(to: UnitLength.kilometers)
    estimateRoute.value = round(estimateRoute.value)
    return "~" + String(describing: estimateRoute)
}

func configure<T>(model: T) {
    if let stop = model as? Stop {
        name.text = stop.name
        address.text = stop.address1 + "\n" + stop.address2
        phone.text = stop.phone
        phone.isHidden = stop.phone.isEmpty
        milage.text = calculateEstimateRoute(to: stop.lat, lon: stop.lng)
        number.text =  "# " + stop.refno
        date.text = stop.departtime
        layer.shouldRasterize = true
        layer.rasterizationScale = UIScreen.main.scale
    }
}

}

Вот ячейка с помощью раскадровки: enter image description here

Может быть, я должен создать 3 ячейки: одну для верхнего OrangeView, вторую для центрального содержимого и третью из нижних кнопок?

Здесьэто:

func getStop<S: Stop>(indexPath: IndexPath) -> S {
    switch segmentIndex {
    case 0:
        return stops.ASSIGNED[indexPath.row] as! S
    case 1:
        return stops.UNASSIGNED[indexPath.row] as! S
    default:
        return Stop() as! S
    }
}

В шапке у меня есть UISegmentedControl

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

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

Вы должны помнить, что ячейки постоянно заполняются при прокрутке видимого списка ячеек на вашем устройстве.это означает, что при прокрутке вверх и вниз вы повторно вычисляете значение.

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

Измените ваш источник данных, просто предоставьте эту информацию как часть вашего объекта Stop.Если вам нужно обновить информацию о расстоянии на основе местоположения пользователей, и вы хотите учесть тот факт, что они могут быть в движении, вы должны использовать startMonitoringSignificantLocationChanges (), и, поскольку местоположение обновляется, вы вычисляете предполагаемый маршрут.

Вы можете использовать следующие сведения для получения обновлений местоположения:

подписаться на обновления местоположения.https://developer.apple.com/documentation/corelocation/cllocationmanager/1423531-startmonitoringsignificantlocati

метод, который вам нужно реализовать для получения обновлений местоположения.https://developer.apple.com/documentation/corelocation/cllocationmanagerdelegate/1423615-locationmanager

0 голосов
/ 24 мая 2018

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

Я предлагаю вам запустить Instruments с Time Profiler и посмотреть, сколько процессорной мощности выделено для этой функции.Если это важно, вы можете подумать о том, чтобы поместить эту функцию в фоновый поток - возможно, используя очередь операций, чтобы вызовы можно было отменять в prepareForReuse.Я использовал аналогичные методы для ячеек, содержащих изображения, поскольку загрузка изображений может занимать много времени.

...