【问题标题】:TableView with NSFetchedResultsController is Flickering so much带有 NSFetchedResultsController 的 TableView 闪烁太多
【发布时间】: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


【解决方案1】:

确保您没有清理数据库。闪烁是可能的原因:

        service.fetchDatasWith { (result) in
        switch result {
        case .success(let data):

            DataManager.clearData() // Cleaning
            DataManager.saveInCoreDataWith(array: data) // Saving again

            print(data)
        case .error(let message):
            DispatchQueue.main.async {
                AlertPresenter.presentAlertWith(title: "Error", message: message, controller: self)
            }
        }
    }

【讨论】:

    猜你喜欢
    • 2011-11-04
    • 2012-02-18
    • 1970-01-01
    • 2013-07-31
    • 2016-09-02
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    相关资源
    最近更新 更多