Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在UITableView中更新数据不顺畅_Ios_Swift_Uitableview - Fatal编程技术网

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()。