如何修复“ UITableViewCell交换数据”?

时间:2019-09-04 23:21:04

标签: ios swift uitableview scroll dispatch

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

很抱歉,我没有足够的声誉来发布.gif图片。

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

上述问题的链接似乎与我的问题有关,但我认为我的问题不是由滚动引起的。

我用UITableViewCell设置了DispatchQueue.global(qos: .background).async,此功能位于单元格内部。

-SensorRecordTableViewCellUITableViewCell)-

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)

调用上面的函数

-{UITableViewDelegateUITableViewDataSource-

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
}

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

1 个答案:

答案 0 :(得分:0)

这是一个简单的示例,以显示其外观, 希望对您有帮助。

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
    }
}