如何在 swift 中仅为唯一值更新 TableView 行?

Posted

技术标签:

【中文标题】如何在 swift 中仅为唯一值更新 TableView 行?【英文标题】:How do i update TableView row only for unique values in swift? 【发布时间】:2021-05-30 03:01:03 【问题描述】:

我有一个实时检测对象的代码,但是,这些对象几乎每一帧都会重新加载,从而导致大量数据。我想找到一种方法来检测对象,而不必每秒重新加载帧。我在下面附加了一些代码 sn-p,它显示了 table view 是如何加载的。

Just for note the prediction is an array of type [VNRecognizedObjectObservation]

//   var predictions: [VNRecognizedObjectObservation] = []


        extension ViewController 
        func predictUsingVision(pixelBuffer: CVPixelBuffer) 
            guard let request = request else  fatalError() 
            // vision framework configures the input size of image following our model's input configuration automatically
            self.semaphore.wait()
            let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer)
            try? handler.perform([request])
        
        
        // MARK: - Post-processing
        func visionRequestDidComplete(request: VNRequest, error: Error?) 
            self.measure.labell(with: "endInference")
            if let predictions = request.results as? [VNRecognizedObjectObservation] 
    //            print(predictions.first?.labels.first?.identifier ?? "nil")
    //            print(predictions.first?.labels.first?.confidence ?? -1)
                
                let pred = request.results?.first
    //            print(pred)
    //            print(predictions.first?.labels.first?.identifier as Any)
                
    //            print(predictions)
     
                // This is where the table is being loaded each frame. 
                self.predictions = predictions
                DispatchQueue.main.async 
                    self.boxesView.predictedObjects = predictions
                    self.labelsTableView.reloadData()
    
                    // end of measure
                    self.measure.end()
                    
                    self.isInferencing = false
                
             else 
                // end of measure
                self.measure.end()
                
                self.isInferencing = false
            
            self.semaphore.signal()
        
    

【问题讨论】:

首先不要使用信号量来强制异步任务变为同步。学习了解异步数据处理的行为。 UiTableView 提供了一个 API 来重新加载单行。但出于您的目的,diffable 数据源可能更合理。 感谢您的回复,您能否提供其工作原理的示例代码?由于我在 ios 开发方面相当新,而且我对某些术语相当陌生。 我不熟悉VNRecognizedObjectObservation API。这是重新加载单行的方法:reloadRows(at:with:) 和 UITableViewDiffableDataSource 【参考方案1】:

我没有进入信号量讨论,如果您想知道如何只更新 tableview 的 1 个单元格,您显然需要知道哪个单元格,由它的 IndexPath 标识,然后通过该路由更新它

    let indexPath = IndexPath(row: 0, section: 0)
    tableView.reloadRows(at: [indexPath], with: .fade)

此代码更新表格视图第一部分中的第一个单元格,您需要设置

row: 0

section: 0

为要更新的表格视图单元格设置正确的值。

【讨论】:

以上是关于如何在 swift 中仅为唯一值更新 TableView 行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在UITextField中仅为UIControlEvent.allEditingEvents覆盖addTarget?

如何在通用 UIViewController - 通用应用程序中仅为 iPAD 创建 IBOutlet

如何在我的 Spring Boot Security OAuth2 应用程序中仅为某些类启用 OAuth2?

在 Swift 5.3 中仅更新存储在 userData 中的两个 UITextField 之一

在swift中仅使用来自firebase的值返回一个键

如何在 QTableWidget 中仅获取包含值的行/列数?