0

我有一个 NSManagedObjects 数组,它由几个片段共享,一些在主队列上,一些在回调闭包内。有时,当我清除这个数组时,代码的其他部分会尝试访问它以读取并在 UI 上显示数据,并且由于它有时找不到数据而崩溃。

我正在考虑使用 NSLocks 来保护这个数组的写入或读取,但是我不确定这种方法是否安全和正确。我愿意接受建议或纠正这种方法。

4

1 回答 1

1

Apple不建议在不同线程之间共享相同的 NSManagedObject:

NSManagedObject 实例不打算在队列之间传递。这样做可能会导致数据损坏和应用程序终止。当需要将托管对象引用从一个队列传递到另一个队列时,必须通过 NSManagedObjectID 实例来完成。

您应该在不同的线程上有不同的对象副本。

我认为在你的情况下你有两个问题:

  1. NSManagedObject 共享的第一个问题。如果一个线程上的 NSManagedContext 丢弃了他的缓存,如果其他线程使用上下文中的 NSManagedObjects,那么其他线程就会出现异常。
  2. 您在线程上共享相同的 NSMutableArray。如果您在一个线程(数据源线程)上从数组中删除对象,而其他线程(例如 UI 线程)尝试获取已删除索引上的对象,您将遇到范围异常。要解决这种情况,您应该将数组复制到其他线程,并通知他们有新数据可用。您应该这样做,因为 NSMutableArray不是线程安全的。
于 2017-10-24T10:25:27.867 回答