在NSFetchedResultsController

时间:2016-03-31 15:11:10

标签: ios swift uitableview

在我们的应用程序中,我们有一个管理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
}

0 个答案:

没有答案