Ios 在UITableView中更新数据不顺畅
我正在使用Ios 在UITableView中更新数据不顺畅,ios,swift,uitableview,Ios,Swift,Uitableview,我正在使用NSFetchedResultsController在表视图中显示已保存的数据。同时,我正在通过web服务检查新数据。当我从网络接收数据时,我的数据库会用新数据更新。tableView会自动更新。 但是tableView中的更新并不顺利。请为swift 4提供合适的解决方案。 请观看我上传的视频,以便更好地解释。 这是我的NSFetchedResultsController委托实现 extension CoreDataTableViewController: NSFetchedRes
NSFetchedResultsController
在表视图中显示已保存的数据。同时,我正在通过web服务检查新数据。当我从网络接收数据时,我的数据库会用新数据更新。tableView
会自动更新。
但是tableView
中的更新并不顺利。请为swift 4
提供合适的解决方案。
请观看我上传的视频,以便更好地解释。
这是我的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()
}
扩展CoreDataTableViewController:NSFetchedResultsControllerDelegate{
func controllerWillChangeContent(\ucontroller:NSFetchedResultsController){
tableView.beginUpdate()
}
func控制器(控制器:NSFetchedResultsController,didChange sectionInfo:NSFetchedResultsSectionInfo,atSectionIndex sectionIndex:Int,类型:NSFetchedResultsChangeType){
设set=IndexSet(整数:sectionIndex)
开关(类型){
案例.插入:
tableView.insertSections(设置,带:.fade)
案例.删除:
tableView.deleteSections(设置,带:.fade)
违约:
打破
}
}
func控制器(controller:NSFetchedResultsController,didChange anObject:Any,在indexPath:indexPath?处,对于类型:NSFetchedResultsChangeType,newIndexPath:indexPath?){
开关(类型){
案例.插入:
tableView.insertRows(位于:[newIndexPath!],带:.fade)
案例.删除:
tableView.deleteRows(位于:[indexPath!],带:.fade)
案例。更新:
tableView.reloadRows(位于:[indexPath!],带:.fade)
案件.动议:
tableView.deleteRows(位于:[indexPath!],带:.fade)
tableView.insertRows(位于:[newIndexPath!],带:.fade)
}
}
func controllerDidChangeContent(\控制器:NSFetchedResultsController){
tableView.endUpdates()
}
您可以尝试以下方法:
tableView.beginUpdates()
tableView.endUpdates()
苹果说:
如果需要后续的插入、删除和删除,请调用此方法
选择操作
您不应该在组内调用reloadData();如果您调用
方法,则必须自己执行任何动画
我解决了这个问题
之前,在生成所有的NSManagedObject
之后,我只使用了一次saveContext
(在for循环之后)。现在,我在生成每个NSManagedObject
之后使用saveContext
。下面是我创建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.
我还没有完全理解它,但它确实解决了问题。
我将非常感谢任何能够进一步解释的人。向我们展示NSFetchedResultsController
委托实现我编辑了这个问题以展示NSFetchedResultsController委托实现。我不会在任何地方调用reloadData()。