【问题标题】:All Core Data properties turn nil所有 Core Data 属性都变为 nil
【发布时间】:2013-11-26 16:51:58
【问题描述】:

我对核心数据有点陌生,但因此我认为我在这里没有做任何复杂的事情。我有一个对象持久化到核心数据,它与另一个对象具有非常简单的一对一关系。我用一个简单的获取请求和一个表格视图来显示我的对象的所有实例。一切都很好。

如果您停留在表格视图上并滚动足够长的时间,突然间所有表格单元格都会变为空白。我已经将问题追溯到我的核心数据对象数组;数组仍然存在,持久对象仍然存在,但我的所有属性突然设置为零。

什么会导致这种行为?我已经订阅了 Core Data Will 和 Did 保存方法,它们没有被解雇。我可以使用其他技巧来调试此问题吗?

EDIT - 包括用于持久化对象的方法如下:

- (void) persistLongActivity: (NSDictionary*) longActivityData 
{
PersistedLongActivity *toPersist = [NSEntityDescription insertNewObjectForEntityForName: @"PersistedLongActivity" inManagedObjectContext: [self managedObjectContext]];

toPersist.startDate = [longActivityData valueForKey:@"startDate"];
toPersist.endDate = [longActivityData valueForKey:@"endDate"];
toPersist.type = [longActivityData valueForKey:@"type"];

[self saveContext];
}

【问题讨论】:

  • 您需要发布一些代码,也许是您如何创建新实体并保存它的示例。
  • 在你的保存方法中,是否检查是否有保存错误?
  • 可以发saveContext的方法吗?
  • 如何创建上下文?你保留它吗?你在重置你的上下文吗?
  • 谢谢@DanShelly 我有很多样板核心数据代码从其他管理上下文的地方复制。看来上下文是线程相关的,我认为这导致了我的问题(见下面的答案)。

标签: ios objective-c core-data


【解决方案1】:

它们正在消失,因为 A.R.C.正在从记忆中杀死他们。你的指针正在染色。创建更强大的参考。

【讨论】:

  • 我所有的属性都设置为保留。这就是 Core Data 自动生成的内容。
【解决方案2】:

所以我认为问题在于我在后台线程上从核心数据中检索。我试图从主线程中取出数据检索,所以我没有降低用户性能,但听起来 Core Data 离开主线程是个坏主意?无论哪种方式,将检索保留在主线程上似乎可以解决手头的问题。

如果有人可以解释为什么在后台线程中从 Core Data 检索会导致这种行为,或者如果有人可以提供更好的解决方案来从 Core Data 检索而不延迟主线程,我很乐意在 cmets 中听到它.

【讨论】:

  • 显然上下文是线程相关的。您不能跨线程和上下文使用托管对象,只有对象 ID 可以安全地在线程/上下文之间传输。你的 BG 上下文被释放,导致所有注册对象的属性无效。
  • 基本上,Core Data 不是线程安全的,跨线程和/或队列会搞砸事情。只要你做对了,在后台使用 Core Data 就可以了。
  • 谢谢@TomHarrington,但“正确”的方式是什么?我的 UI 代码必须在主线程上运行,但听起来如果我曾经在后台线程上检索数据对象,它们就不能在主线程上使用?如何在两者之间架起桥梁?
  • 查看队列限制和performBlockperformBlockAndWait 方法。
猜你喜欢
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多