【发布时间】:2019-07-29 06:48:19
【问题描述】:
我有一个带有 FRC 的 tableView。我使用 NSMergeByPropertyObjectTrumpMergePolicy 作为 managedContext 保存的 mergePolicy。
问题是当记录更新的“didChange”委托方法被调用 3 次时。它要求按插入、删除、更新的顺序。所以我的 tableView 闪烁了很多。
如何防止这种情况发生?因为我的应用程序的每条记录都更新了 4 次,所以 tableView 闪烁了 12 次..
我的委托方法:
func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.beginUpdates()
}
func controller(controller: NSFetchedResultsController<NSFetchRequestResult>, didChangeSection sectionInfo: NSFetchedResultsSectionInfo, atIndex sectionIndex: Int, forChangeType type: NSFetchedResultsChangeType) {
switch type {
case .insert:
tableView.insertSections(NSIndexSet(index: sectionIndex) as IndexSet, with: .fade)
case .delete:
tableView.deleteSections(NSIndexSet(index: sectionIndex) as IndexSet, with: .none)
case .move:
break
case .update:
break
}
}
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
print("cs \(type.rawValue)")
switch type {
case .insert:
tableView.insertRows(at: [newIndexPath! as IndexPath], with: .none)
break
case .delete:
tableView.deleteRows(at: [indexPath!], with: .none)
break
case .move:
tableView.deleteRows(at: [indexPath!], with: .none)
tableView.insertRows(at: [newIndexPath!], with: .none)
//tableView.moveRow(at: indexPath!, to: newIndexPath!)
break
case .update:
tableView.reloadRows(at: [indexPath!], with: .none)
break
}
}
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.endUpdates()
}
【问题讨论】:
-
向我们展示您正在使用的代码。您是否使用 controllerWillChangeContent 和 controllerDidChangeContent 进行批量操作?
-
是的,我正在使用。我编辑问题。
-
您尝试过使用 beginUpdates 和 endUpdates 吗? developer.apple.com/reference/uikit/uitableview/… ,不确定是否有帮助,但可以
-
@Luzo 感谢您的建议。我在问题中分享了代码。我错过了什么?
-
正如我所说 NSMergeByPropertyObjectTrumpMergePolicy 不适合该应用程序。我开发了这种方法; 1- fetchRecord 2- 如果找到记录更新它 3- 如果没有找到记录保存它。所以只发生插入和更新操作。
标签: swift uitableview merge nsfetchedresultscontroller flicker