加载主 TableViewController 后,值从核心数据中消失

Posted

技术标签:

【中文标题】加载主 TableViewController 后,值从核心数据中消失【英文标题】:Value disappears from CoRe DaTa after loading main TableViewController 【发布时间】:2017-07-27 18:30:33 【问题描述】:

当我从 CoreData 加载主 TableView 项目列表时,它通过以下方式完美显示:

let fetchRequest:NSFetchRequest<Identity> = Identity.fetchRequest()
        do
        
            identities = try DatabaseController.getContext().fetch(fetchRequest)
            print("number of results: \(identities.count)")
            for identity in identities as [Identity]
            
                print("\(identity.pName!) is \(identity.accuracy)% Robesper. Updeted \(identity.lastModified!).")
            
        
        catch
        
            print("Error fetchRequest in ViewWillApper: \(error)")
        

删除也很有效,所以我创建了一个新的 NavigationController 和一个用于添加新对象的视图。

为了检查列表并找出问题所在(很明显),我输出了 list.count 。因为当我加载带有列表新项目的主 TableView 时,基本上不会出现。但是,当我重新启动模拟器时,它会显示所有项目。

所以 1. 创建新对象。

    将此插入CoreData。 已检查。它就在那里!你可以看到...
> number of results: 3 Hello World is 99% Robesper. Updeted 2017-07-08
> 17:50:30 +0000. Sex is 99% Robesper. Updeted 2017-07-27 17:56:12
> +0000. test is 99% Robesper. Updeted 2017-07-27 18:03:28 +0000.

    现在 -> 转到 TableView -> 我在 viewDidLoad 和 viewWillAppear 检查了列表。

    它是“0”。太好了,因为它并不杂乱,我们现在可以从 TableViewController 中的 CoreData 列表中查看。

    number of results viewDidLoad: 0
    viewWillAppear: 0
    number of results: 2
    Sex is 99% Robesper. Updeted 2017-07-27 17:56:12 +0000.
    Hello World is 99% Robesper. Updeted 2017-07-08 17:50:30 +0000.
    after fetch: 2
    

    已获取。但是现在缺少 1 个新值!?什么???

    重新启动模拟器。它现在向我展示了 3 个项目。但是当我重复添加项目时,它会再次发生。

可能是因为我们从 AppDelegate 保存的程序终止了?

func applicationWillTerminate(_ application: UIApplication)

    DatabaseController.saveContext()

我在 ViewWillAppear 上粘贴了 save .saveContext(),没有用。什么?我做错了什么伙计们?请!救救我:D

【问题讨论】:

请将项目保存到主队列中 并将表重新加载到主队列中 请检查我的回答。 我正在检查几天......耐心) 【参考方案1】:

从核心数据中获取结果后,当视图出现在主队列中时,您应该重新加载表。

DispatchQueue.main.async 
tableView.reloadData()

【讨论】:

应该是:self.tableView.reloadData() 但是,没有帮助=( 尝试将数据插入主队列中的数据库。我也面临同样的问题@OleksandrZheliezniak【参考方案2】:

    您应该在插入项目后保存上下文。

    视图不会自行更新。您需要在表视图上重新获取并调用 reloadData。或者使用 NSFetchedResultsController 将表连接到 CoreData 查询:https://developer.apple.com/documentation/coredata/nsfetchedresultscontroller

【讨论】:

已经完成...在填写完所有字段后:DatabaseController.saveContext() 还从内存中清除了新项目信息:DatabaseController.getContext().delete(identity) tableView.reloadData() 也试过在 ViewDidAppear 中【参考方案3】:

获取进程/设置变量...然后...

我认为我应该清理用于存储数据的临时变量。所以我用DatabaseController.getContext().delete(identity) 来保持它的清洁。 但是,在 SWIFT 中没有必要这样做,因为该 MANAGER 可以为您完成。您所需要的一切 - SAVE'n'GO 以重新加载表格/数据列表 只需评论即可解决所有问题)

//DatabaseController.getContext().delete(identity)
DatabaseController.saveContext()

【讨论】:

以上是关于加载主 TableViewController 后,值从核心数据中消失的主要内容,如果未能解决你的问题,请参考以下文章

登录->第一个视图(tableviewcontroller)

从 tableviewcontroller 加载 tableviewcontroller 不起作用

倒带时自动重新加载 TableViewController

在 tableviewController 中重新加载数据失败

如果当前视图是 tableViewController,iOS TableView 不会重新加载

在 tableViewController 中使用重新加载的 CoreData