【问题标题】:Occasional "Illegal attempt to establish a relationship '...' between objects in different contexts"偶尔“非法尝试在不同上下文中的对象之间建立关系'...'”
【发布时间】:2012-08-16 01:16:06
【问题描述】:

我们偶尔会收到来自用户的崩溃报告(我们正在使用将崩溃发送到我们的服务器的崩溃报告程序包)并出现以下错误:

“非法尝试在不同上下文中的对象之间建立关系'...'”

(不同的报告可能有不同的关系,并非所有报告都相同)。

这似乎很容易,除了:

  1. 我们的代码中只有一个 NSManagedObject - 来自 App 委托的单例。

  2. 我们不使用除主线程之外的任何线程。

  3. 所有对象都使用initWithEntity:insertIntoManagedObjectContext: 的上下文分配(没有一个是通过简单的初始化分配的)。

  4. 在我们的测试中从未发生过错误(数千次运行)。

所以基本上我们被卡住了。

任何想法都会受到赞赏。

【问题讨论】:

  • 我在我的应用程序中遇到了同样的问题 - 一个 managedObjectContext,测试中没有问题,来自用户的崩溃报告与此消息 - 如果你能告诉我你发现了什么,我真的非常感激解决这个问题
  • 嗨,有什么解决办法吗?我也有同样的问题。

标签: iphone ipad core-data nsmanagedobjectcontext


【解决方案1】:

每当我在主线程中使用 Core Data 时,我都会在任何处理上下文的方法中放置一个 NSAssert,以确保我知道主线程中正在发生的一切。像这样的:

NSAssert([NSThread isMainThread], @"This method is not in the main thread");

尝试使用它来双重/三重/四重检查事情是否在您认为的地方发生。

【讨论】:

  • 谢谢,我会试试的,虽然正如我所说,崩溃在我们的测试中从未发生过:(
  • 更多的是预防措施。我有一个基于核心数据的应用程序,它在处理上下文时显示了一个 MBProgressHUD。忘记了 MBProgressHUD 创建了一个单独的线程,但在测试期间从未崩溃。只是在它上线并且少数用户报告崩溃时才发现。因此,它在测试中似乎可以正常工作,同时仍然在单独的线程上工作。希望对您有所帮助。
  • 我知道有一些操作发生在专用线程中(尽管我相信 MBProgressHUD 在主线程中运行,因为它会更新 UI),但问题是 - 他们不访问我的应用程序中的核心数据,所以它们可能不是原因。
  • 我在这个假设下使用 hud 进行操作,然后发现 MBProgressHUD 的 showWhileExecuting: 方法创建了一个新线程。这就是我创建第二个线程的地方。
猜你喜欢
  • 2011-08-31
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多