如何修复 'data of UITableViewCell exchange'?

How to fix 'data of UITableViewCell exchange'?

我的UITableViewCell某两行数据交换,it是这样的。 交换后的行数据是正确的,交换前是错误的。

很抱歉 post .gif 图片没有足够的声誉。

有什么方法可以避免数据交换到错误的行?

上面的问题链接好像和我的有关,但我想我的问题不是滚动引起的。

我用 DispatchQueue.global(qos: .background).async 设置了 UITableViewCell,这个函数在单元格本身内部。

--SensorRecordTableViewCell (UITableViewCell)--

func getNewLiveInfo(shedId: String, sensorCategory: String) {

        DispatchQueue.global(qos: .background).async {

            let id = self.shedId.cString(using: .utf8)
            let shed_id = UnsafeMutablePointer(mutating: id)

            let category = self.sensorCategory.cString(using: .utf8)
            let sensor_category = UnsafeMutablePointer(mutating: category)

            if let data = getliveInfo(shed_id, sensor_category) {
                let formatter = DateFormatter()
                formatter.locale = Locale(identifier: "en_US_POSIX")
                formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"

                // record_id, sensor_id, sensor_category, sensor_value, read_time
                self.sensorRecord.recordId = String(cString: data.pointee!)
                self.sensorRecord.sensorId = String(cString: (data+1).pointee!)
                self.sensorRecord.sensorCategory = String(cString: (data+2).pointee!)
                self.sensorRecord.value = Double(String(cString: (data+3).pointee!))
                self.sensorRecord.time = formatter.date(from: String(cString: (data+4).pointee!))

                DispatchQueue.main.async {
                    self.setValueAndTime()

                }
                data.deallocate()
            }
        }     
    }

然后从func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)

调用上面的函数

--UITableViewDelegate,UITableViewDataSource--

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

        var cell = cell as! SensorRecordTableViewCell
        cell.getNewLiveInfo(shedId: shed.id!, sensorCategory: config.sensorRecordOrder[indexPath.row])
}

最后,我从 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

设置单元格
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: sensorCellId, for: indexPath) as! SensorRecordTableViewCell
        cell.setUpView(shedId: shed.id!, sensorCategory: config.sensorRecordOrder[indexPath.row])
            return cell
}

有什么方法可以避免数据交换到错误的行?

这里有一个简单的例子来展示它应该是什么样子, 希望对你有帮助。

class SensorRecord {
    var recordID: Int = 0
    var sensorID: Int = 0
}

class ViewController: UIViewController {

    private var dataSource = [SensorRecord]()

    override func viewDidLoad() {
        super.viewDidLoad()

        // request infos from your server
        getNewLiveInfo(completion: { (sensorRecords)
            // after the request success, reload data
            self.dataSource = sensorRecords
            self.tableView.reloadData()
        })
    }

}

// MARK: UITableViewDataSource
extension ViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dataSource.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "ID", for: indexPath)

        // let your cell to show datas from your server
        let sensorRecord = dataSource[indexPath.row]
        cell.update(with: sensorRecord)

        return cell
    }
}