在UITableView中更新数据并不顺利

时间:2017-11-17 07:18:11

标签: ios swift uitableview

我正在使用NSFetchedResultsControllertableView中显示已保存的数据。与此同时,我正在通过Web服务检查新数据。当我从网络接收数据时,我的数据库会使用新数据进行更新。 tableView会自动更新。 但tableView中的更新并不顺利。请为swift 4提供合适的解决方案。 请观看我上传的视频以获得更好的解释。 https://www.youtube.com/watch?v=XhSEykQcP5A&feature=youtu.be

这是我的NSFetchedResultsController委托实施

extension CoreDataTableViewController: NSFetchedResultsControllerDelegate {
func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
    tableView.beginUpdates()
}

func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange sectionInfo: NSFetchedResultsSectionInfo, atSectionIndex sectionIndex: Int, for type: NSFetchedResultsChangeType) {
    let set = IndexSet(integer: sectionIndex)
    switch (type) {
    case .insert:
        tableView.insertSections(set, with: .fade)
    case .delete:
        tableView.deleteSections(set, with: .fade)
    default:
        break
    }
}

func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
    switch(type) {
    case .insert:
        tableView.insertRows(at: [newIndexPath!], with: .fade)
    case .delete:
        tableView.deleteRows(at: [indexPath!], with: .fade)
    case .update:
        tableView.reloadRows(at: [indexPath!], with: .fade)
    case .move:
        tableView.deleteRows(at: [indexPath!], with: .fade)
        tableView.insertRows(at: [newIndexPath!], with: .fade)
    }
}

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

2 个答案:

答案 0 :(得分:1)

你可以试试这个:

   tableView.beginUpdates()
   tableView.endUpdates()
Apple说:

  

如果您想要后续插入,删除和,请调用此方法   选择行动。

...

  

你不应该在组内调用reloadData();如果你这样称呼   在组内的方法中,您必须自己执行任何动画。

答案 1 :(得分:0)

我解决了这个问题。

之前,在生成所有saveContext之后,我只使用NSManagedObject一次(在for循环之后)。现在,我在生成每个saveContext后使用NSManagedObject。以下是我创建NSManagedObject并保存它们的代码片段。

                        for z in 0...(json.count - 1) {
                        let a = json[z]["PackageName"].stringValue
                        let b = json[z]["ExamGroupId"].stringValue
                        let c = json[z]["TestList"].stringValue
                        let d = json[z]["TestPackageId"].stringValue
                        _ = TestPackage(packageNameCD: a, examGroupIdCD: b, testListCD: c, testPackageIdCD: d, context: self.fetchedResultsControler.managedObjectContext)
                        (UIApplication.shared.delegate as! AppDelegate).saveContext() // now I am saving here itself and not after the loop.

                    }
                    // (UIApplication.shared.delegate as! AppDelegate).saveContext() // earlier, I was saving here, after the for loop.

我还没有完全理解它。但它确实解决了这个问题。 我将非常感谢能够进一步解释的任何人。