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

Posted

技术标签:

【中文标题】使用 NSFetchedResultsController 委托方法将多行插入 tableView 时的问题【英文标题】:Issues when inserting multiple rows into a tableView using NSFetchedResultsController delegate methods 【发布时间】:2017-01-26 05:22:00 【问题描述】:

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

另外,我使用的是 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 的除数

【问题讨论】:

您没有实施更新/移动的任何原因? 数据从未更新或移动,但值得一试。我会在今天晚些时候在我的电脑前添加它们。 【参考方案1】:

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

这就是我的答案。 https://***.com/a/38867302/4745553

编辑

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

这也帮助我修复了它。 https://***.com/a/3013353/4745553

【讨论】:

以上是关于使用 NSFetchedResultsController 委托方法将多行插入 tableView 时的问题的主要内容,如果未能解决你的问题,请参考以下文章

核心数据保存竞争条件错误

在 Swift 3 中难以配置 NSFetchedResultsController

为啥 beginUpdates/endUpdates 会重置表视图位置以及如何阻止它这样做?

测试使用

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?