如何在 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?