为啥我可以在 viewDidAppear 中访问 Core Data 实体,但不能在 viewDidLoad 中访问?

Posted

技术标签:

【中文标题】为啥我可以在 viewDidAppear 中访问 Core Data 实体,但不能在 viewDidLoad 中访问?【英文标题】:Why I can access Core Data entities in viewDidAppear, but not in viewDidLoad?为什么我可以在 viewDidAppear 中访问 Core Data 实体,但不能在 viewDidLoad 中访问? 【发布时间】:2013-01-26 11:13:48 【问题描述】:

我有一个 UITableViewController 子类,当我尝试从 viewDidLoad 获取一些实体时,我得到一个空数组。但是当我在 viewDidAppear 中使用相同的代码时,我得到了这些实体!怎么样?

【问题讨论】:

【参考方案1】:

您使用的是NSFetchedResultsController 吗?这是使用 Core Data 填充表视图的推荐(也是最简单的)方法。您不必关心获取时间,因为结果控制器会为您管理。

如果没有 FRC,您需要负责填充表格。根据您的设置,即您如何创建视图控制器,所有必要的部分(包括托管对象上下文,或数据数组,或您的表格视图本身)可能在 viewDidLoad 运行时尚未完全加载.通常,viewDidLoad 最适合用于从 nib 或故事板加载的视图控制器。您在prepareForSegue: 或类似方法中提供必要的属性,它们将可用于viewDidLoad:

不过,您应该选择 FRC。它将通过数据源方法或多或少地懒惰地进行获取。这也是性能和内存管理的最佳选择。

【讨论】:

现在我正在使用一个自定义类来为我获取这些实体,稍微更改它们并将它们重新排列在一个带有 NSDictionaries 的 NSArray 中(因为我正在向实体添加一些额外的属性,只是用于演示目的)。在这种情况下,使用 FRC 是否仍然合适? NSFetchedResultsController 的所有错误部分都修复了吗?从历史上看,它有问题。 我没有在 FRC 中发现任何错误。是的,FRC 是合适的方式,即使您想与其他信息相结合。要获取的自定义类在内存管理方面似乎是不利的。

以上是关于为啥我可以在 viewDidAppear 中访问 Core Data 实体,但不能在 viewDidLoad 中访问?的主要内容,如果未能解决你的问题,请参考以下文章

在 IOS 4.x 或更低版本中,将子视图添加到视图时不会调用 viewDidAppear 方法,为啥?

为啥 nib 文件中的 UITableViewCell(加载并添加到堆栈)在 viewDidAppear 中为零,但在 viewDidLoad 中没问题?

为啥后台和重新打开应用程序不调用 viewDidAppear?

为啥 UIScrollView contentSize 在 IB 中被忽略,但当我在 viewDidAppear 方法中设置它时有效?

使用 viewDidAppear 的自动登录不利用导航控制器

在 viewDidAppear 之前获取 scrollView 的内容大小