2013-01-19 96 views
6

是否有一种安全的方式来删除应用程序中的持久性存储(并创建一个新的),其中的其他线程正在使用与要删除的存储关联的NSManagedObjectContext?我试图锁定NSPersistentStoreCoordinator并在操作结束后将其解锁,但这并没有帮助 - 我所有的尝试都导致了死锁。它总是发生在这条线(主线程上执行):核心数据 - 移除持久性存储时发生死锁

[self.persistentStoreCoordinator removePersistentStore: store error: &error]; 
+0

你可以发布相关线程的堆栈跟踪图像吗? –

+0

你在使用线程限制或队列限制吗?你正在使用父子上下文吗? – quellish

+0

你首先应该确定**你为什么要这么做,然后看看你是否可以想出另一种解决方案。在大多数情况下,你最好先拆除整个堆栈,并确保托管对象的任何东西都听取有关堆栈消失的通知,以便释放它们的引用。你所要做的就像把摩天大楼的一楼扯下来,并期待一切都保持原样。 –

回答

2

我没有试过,但是从docs on mocsetPersistentStoreCoordinator: ...

协调提供了管理对象模型和处理 持久性。请注意,多个上下文可以共享协调器。

如果协调器为零,则此方法引发异常。如果你想 “断开”从它的持久存储协调上下文,你 应该简单地将所有强引用上下文为零和 允许其正常释放。

这表明安全地清除PSC是先有一个MOC释放它(零出参考它在ARC)每一个线程,然后执行removePersistentStore:

+0

所以你认为这个问题存在,因为有一个流氓背景需要被释放? –

+0

是的,我猜想不止一个,等着彼此解锁。 – danh

+1

调试建议:创建一个“NSManagedObjectContext”的自定义子类。让它用一个从未保存的'NSValue'到'setPersistentStoreCoordinator:...','dealloc'等持久存储协调器的映射来更新一个全局字典,并且可能还有一些其他信息可以正确识别上下文。为了识别流氓,检查字典。 – Tommy

1

我会尝试使用此处介绍(第父/子上下文的方法): Multi-Context CoreData

基本上,您的PSC只有一个与其关联的MOC(父母MOC)。其他线程拥有自己的MOC,其parentContext设置为主MOC(与PSC关联的MOC)。

那么你可以尝试这样的事:

// Save each child MOC 
for (NSManagedObjectContext *moc in self.someChildMOCs) 
{ 
    [moc performBlockAndWait:^{ 

     // push to parent 
     NSError *error; 
     NSAssert([moc save:&error]); 
     moc.parentContext = nil; 
    }]; 
} 

// Save parent MOC to disk 
[self.mainMOC performBlockAndWait:^{ 
    NSError *error; 
    NSAssert([mainMOC save:&error]); 
}]; 

[self.persistentStoreCoordinator removePersistentStore:store error:&error]; 
mainMOC.persistentStoreCoordinator = nil; 
1

是否有删除的持久性存储的安全方式(并创建一个新的)应用程序中,而其他线程使用的NSManagedObjectContext的关联该商店被删除?

它应该是安全的如果你能保证没有现场管理的对象将试图访问持久性存储。这部分至关重要:您必须确保没有任何类型的实时对象已从旧持久性存储中加载或以其他方式关联。

可通过重新设置每个被管理对象上下文做到这一点:

[managedObjectContext performBlockAndWait:^{ 
    [managedObjectContext reset]; 
}]; 

一旦你做到了这一点为管理对象上下文,可以删除持久性存储。

请注意,如果您有任何托管对象是从这些上下文中获取的,则必须立即将它们处理掉,而无需读取或写入属性值或以任何方式使用它们。由于各种原因,这些对象可能需要使用上下文,但在调用reset后,上下文不再了解它们。立即摆脱它们(理想情况下甚至在调用重置之前),因为它们是在您触摸它们时等待炸毁应用程序的时间炸弹。

相关问题