在我们的应用程序中,我们有一个管理UITableView的控制器(在这种情况下不是UITableViewController)。该控制器既是表视图的委托和数据源。它也是NSFetchedResultsController(以下简称FRC)代表。我们为表视图单元注册一个具有一致重用标识符的自定义nib。在重新加载8个单元格之后,我们在View Debugging上看到了UITableView(技术上讲UITableViewWrapperView)中的大约40个UITableViewCells - >捕获视图层次结构屏幕。
为什么UITableView不能从视图层次结构中删除单元格?不幸的是,经过几批上述更新后,UITableView的滚动显着滞后,这是一个巨大的性能问题。
我们的FRC-> UITableView代码:
didChangeObject:
switch type {
case NSFetchedResultsChangeType.Insert:
self.tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: UITableViewRowAnimation.Fade)
sectionsToReload.addIndex(newIndexPath!.section)
case NSFetchedResultsChangeType.Delete:
self.tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Fade)
sectionsToReload.addIndex(indexPath!.section)
case NSFetchedResultsChangeType.Update:
self.tableView.reloadRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Fade)
sectionsToReload.addIndex(indexPath!.section)
case NSFetchedResultsChangeType.Move:
self.tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Fade)
self.tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: UITableViewRowAnimation.Fade)
sectionsToReload.addIndex(indexPath!.section)
sectionsToReload.addIndex(newIndexPath!.section)
}
didChangeSection:
let indexSet = NSIndexSet(index: sectionIndex)
switch type {
case NSFetchedResultsChangeType.Insert:
self.tableView.insertSections(indexSet, withRowAnimation: UITableViewRowAnimation.Fade)
self.insertedSections.addIndexes(indexSet)
case NSFetchedResultsChangeType.Delete:
self.tableView.deleteSections(indexSet, withRowAnimation: UITableViewRowAnimation.Fade)
self.deletedSections.addIndexes(indexSet)
default:
return
}
controllerWillChangeContent:
self.tableView.beginUpdates()
self.insertedSections = NSMutableIndexSet()
self.deletedSections = NSMutableIndexSet()
self.sectionsToReload = NSMutableIndexSet()
controllerDidChangeContent:
for section in self.insertedSections {
if self.sectionsToReload.containsIndex(section) {
self.sectionsToReload.removeIndex(section)
}
}
for section in self.deletedSections {
if self.sectionsToReload.containsIndex(section) {
self.sectionsToReload.removeIndex(section)
}
}
if shouldReloadSectionsWhenRowsChange {
self.tableView.reloadSections(self.sectionsToReload, withRowAnimation: .None)
}
self.tableView.endUpdates()
UITableViewDataSource方法
public override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let sections = self.fetchedResultsController.sections {
return sections[section].numberOfObjects
} else {
return 0
}
}
public override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
if let sections = self.fetchedResultsController.sections {
return sections.count
} else {
return 0
}
}
public override func getCount() -> Int {
if let count = self.fetchedResultsController.fetchedObjects?.count {
return count
}
return 0
}
public override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
guard let cell = self.tableView.dequeueReusableCellWithIdentifier(cellNibIdentifier) else {
Rlog.e(self, "Failed to dequeueReusableCellWithIdentifier:\(cellNibIdentifier)")
return UITableViewCell()
}
self.configureCell(cell, indexPath: indexPath)
return cell
}