正在更新的单元数多于表中存在的单元数?

问题描述 投票:0回答:1

我对我的Swift iOS应用程序中似乎很简单的问题感到困惑。我想做的是在表格中显示100个单元格的列表,每个单元格显示“ Hello World”。在cellForRowAt中:我正在通过在后台线程上执行2秒钟的睡眠调用来模拟网络调用。该模拟网络调用完成后,我将更新表格视图单元格,以使文本以粗体显示。

我在这里有2个问题:1)滚动似乎有些断断续续。您如何解决这个问题?2)当我启动该应用程序时,如果我真的快速向下滚动到列表的末尾,我会看到有100多个单元格被更新(即查看cellForRowAt中的print语句)。但是,如果我从上到下缓慢滚动,则会看到100个单元格已更新。为什么会这样?

这是主要的ViewController.swift文件:

import UIKit

final class ViewController: UIViewController {

    // MARK: - Variables
    private var cellsUpdated: Int = 0
    private let fontSize17: CGFloat = 17
    private let tableview: UITableView = {
        let tv = UITableView()
        tv.backgroundColor = UIColor.white
        tv.translatesAutoresizingMaskIntoConstraints = false
        return tv
    }()
    private var reuseIdentifier: String = "cell"
    private var sampleData = [TableData]()

    // MARK: - View Life Cycle Methods
    override func viewDidLoad() {
        super.viewDidLoad()
        populateDataSet()
        setupTableView()
    }

    // MARK: - Custom Methods
    private func populateDataSet(){

        (0..<100).forEach { (_) in
            sampleData.append(TableData(value: "Hello World", hasBeenViewed: false))
        }
    }

    private func setupTableView(){

        self.tableview.register(UITableViewCell.self, forCellReuseIdentifier: reuseIdentifier)
        self.tableview.delegate = self
        self.tableview.dataSource = self
        view.addSubview(tableview)
        NSLayoutConstraint.activate([
            tableview.topAnchor.constraint(equalTo: self.view.topAnchor),
            tableview.bottomAnchor.constraint(equalTo: self.view.bottomAnchor),
            tableview.rightAnchor.constraint(equalTo: self.view.rightAnchor),
            tableview.leftAnchor.constraint(equalTo: self.view.leftAnchor)
        ])
    }
}

extension ViewController: UITableViewDataSource, UITableViewDelegate
{
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath)
        cell.textLabel?.text = self.sampleData[indexPath.row].value
        cell.textLabel?.font = UIFont.systemFont(ofSize: fontSize17)
        if !self.sampleData[indexPath.row].hasBeenViewed {
            cell.textLabel?.font = UIFont.systemFont(ofSize: fontSize17)
            DispatchQueue.global(qos: .userInteractive).async {
                // Simulate the execution of a CPU time intensive task on the background thread
                sleep(2)
                self.sampleData[indexPath.row].hasBeenViewed = true
                DispatchQueue.main.async {
                    // Update the table cells on the main thread
                    cell.textLabel?.font = UIFont.boldSystemFont(ofSize: self.fontSize17)
                    self.cellsUpdated += 1
                    print("\(self.cellsUpdated) cells have been updated")
                }
            }
        } else {
            cell.textLabel?.font = UIFont.boldSystemFont(ofSize: fontSize17)
        }
        return cell
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return sampleData.count
    }
}

此文件引用了一个名为TableData的类,它只是一个简单的类:

final class TableData {
    // MARK: - Internal Instance Variables
    var value: String
    var hasBeenViewed: Bool

    // MARK: - Init Method
    init(value: String, hasBeenViewed: Bool){
        self.value = value
        self.hasBeenViewed = hasBeenViewed
    }
}

任何帮助将不胜感激。谢谢!

ios swift uitableview uiscrollview
1个回答
0
投票
理想情况下,您已经在开始绘制单元格之前检索了所有需要的数据,而不是为每个单元格执行一次网络调用,这已经非常耗时,并且会导致草率滚动,如您所注意到。
© www.soinside.com 2019 - 2024. All rights reserved.