我正在使用NSFetchedResultsController
在tableView
中显示已保存的数据。与此同时,我正在通过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()
}
答案 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.
我还没有完全理解它。但它确实解决了这个问题。 我将非常感谢能够进一步解释的任何人。