NSManagedObjectContext已锁定

时间:2011-10-29 09:50:42

标签: ios core-data nsmanagedobject nsmanagedobjectcontext

我在我的应用程序中运行了两个线程。

  • 在主线程中,我更新实体中的键值或从Core Data中获取一些行。
  • 在后台线程中,我从服务器下载数据。

但有时在更新/处理[managedObjectContext executeFetchRequest:request error:&error]

上的核心数据时

......我明白了:

#0 0x34507c5c in semaphore_wait_signal_trap ()
 #1 0x34507f58 in semaphore_wait_signal ()

#2  0x364d573a in pthread_mutex_lock ()
#3  0x35c91a2e in -[_PFLock lock] ()
#4  0x35c91a12 in -[NSPersistentStoreCoordinator lock] ()
#5  0x35c919e8 in -[NSManagedObjectContext(_NSInternalAdditions) lockObjectStore] ()
#6  0x35c90676 in -[NSManagedObjectContext executeFetchRequest:error:] ()

NSManagedObjectContext是如何锁定的?我能为此做些什么?

2 个答案:

答案 0 :(得分:3)

锁定是正常操作的一部分,不是问题的根源。

最有可能的是,在单独的线程上管理上下文时遇到问题。确保为每个线程使用不同的上下文,并确保不在线程之间传递托管对象。确保在尝试访问另一个线程上的更改之前合并上下文。

答案 1 :(得分:1)

在多线程应用程序中掌握CoreData可能很困难。确保为使用CoreData的每个线程创建新的NSManagedObjectContext。必须在使用它的线程中创建MOC。 MOC本身不是线程安全的。 CoreData不会为您锁定它。如果为每个线程使用新的MOC,则不必进行锁定。 在堆栈跟踪中,您可以看到NSPersistentStoreCoordinator被锁定(而不是MOC)。 CoreData执行此操作,以便只有一个MOC可以同时访问NSPersistentStoreCoordinator。