保护对NSManaged对象阵列的读/写访问

时间:2017-10-24 09:58:23

标签: ios swift core-data nslock

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

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

1 个答案:

答案 0 :(得分:1)

Apple does not recommend在不同的线程之间共享相同的NSManagedObject:

  

NSManagedObject实例不打算在它们之间传递   队列。这样做可能会导致数据损坏和终止   申请。当需要交出托管对象时   从一个队列引用另一个队列,必须完成   NSManagedObjectID实例。

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

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

  1. 共享NSManagedObject的第一个问题。如果一个线程上的NSManagedContext丢弃了他的缓存,那么如果他们在上下文中使用NSManagedObjects,则在其他线程上会有异常。
  2. 您在线程上共享相同的NSMutableArray。如果在一个线程(数据源线程)上删除数组中的对象,而其他线程(例如UI线程)尝试在删除的索引上获取对象,则会出现范围异常。要解决这种情况,您应该将数组复制到其他线程,并通知它们有新数据可用。你应该这样做,因为NSMutableArray is not thread safe