使用 NSFetchedResultsController 委托方法将多行插入 tableView 时出现问题

Issues when inserting multiple rows into a tableView using NSFetchedResultsController delegate methods

所以我将 NSFetchedResultsController 用于始终增加 10 或任何可被 10 整除的数字的实体。我遇到的问题是在为 NSFetchResultsController 调用委托方法并插入行之后,tableView 将滚动到某个随机位置(通常朝向 table 的底部)。我不知道这是否是单元格高度(动态)的问题,或者单元格包含需要加载的图像这一事实,或者我是否处理了委托方法错误,或者我是否创建对象错误。任何帮助将不胜感激

此外,我正在使用 MoPub,因此 mp_

NSFetchedResultsControllerDelegate 方法

func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
    self.tableView.mp_beginUpdates()
}

func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
    switch type {
    case NSFetchedResultsChangeType.insert:
        guard let insertIndexPath = newIndexPath else { return }
        self.tableView.mp_insertRows(atIndexPaths: [insertIndexPath], with: .fade)
    case NSFetchedResultsChangeType.delete:
        guard let deleteIndexPath = indexPath else { return }
        self.tableView.mp_deleteRows(atIndexPaths: [deleteIndexPath], with: .fade)
    default:
        break
    }
}

func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
    self.tableView.mp_endUpdates()
}

插入方式

for index in 0..<posts.count {
    let post = posts[index]
    guard let _ = RecentPost.createInManagedObjectContext(context: context, post: post, sequence: index) else { continue }
}

createInManagedObjectContext只是我用来插入新对象的方法,post.count总是被除数10

由于我的单元格高度是动态的,我将 estimatedRowHeight 设置为 300,将其更改为 1000 似乎解决了我的问题。如果您知道除此之外的任何其他修复方法,或对我的代码的任何改进,请告诉我。谢谢

这就是我得出答案的原因。

编辑

我实际上仍然有问题,因为我正在响应多个更改,所以我只是使用 controllerDidChangeContent 委托方法并在它们中调用 tableView.reloadData()。他们不是动画,但我正在做的没问题。

这也帮助我修复了它。