Ios 核心数据-删除持久存储时发生死锁

Ios 核心数据-删除持久存储时发生死锁,ios,core-data,Ios,Core Data,当其他线程正在使用与要删除的存储关联的NSManagedObjectContext时,是否有安全的方法删除应用程序中的持久存储(并创建新的持久存储)?我曾尝试锁定NSPersistentStoreCoordinator,并在操作结束后解锁它,但没有帮助-我所有的尝试都导致了死锁。它总是发生在这一行(在主线程上执行): 我没有尝试过这个,但是从setPersistentStoreCoordinator: 协调器提供托管对象模型和句柄 坚持。请注意,多个上下文可以共享一个协调器 如果协调器为nil,

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


我没有尝试过这个,但是从
setPersistentStoreCoordinator:

协调器提供托管对象模型和句柄 坚持。请注意,多个上下文可以共享一个协调器

如果协调器为nil,此方法将引发异常。如果你想 “断开”上下文与其持久存储协调器的连接,您可以 只需将对上下文的所有强引用设置为nil和 允许它正常释放


这意味着移除psc的安全方法是首先让每个带有moc的线程释放它(在ARC中不引用它),然后执行
removePersistentStore:

我将尝试使用这里描述的方法(父/子上下文部分):

基本上,您的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;
当其他线程正在使用与要删除的存储关联的NSManagedObjectContext时,是否有安全的方法删除应用程序中的持久存储(并创建新的持久存储)

如果可以保证没有活动的托管对象尝试访问持久性存储,那么应该是安全的。这一部分非常重要:您必须确保没有任何类型的活动对象从旧的持久性存储加载或与之关联

可以通过重置每个托管对象上下文来执行此操作:

[managedObjectContext performBlockAndWait:^{
    [managedObjectContext reset];
}];
对每个托管对象上下文执行此操作后,可以删除持久存储


请注意,如果您有任何从这些上下文中提取的托管对象,则必须立即处置它们,而无需读取或写入属性值或以任何方式使用它们。这些对象可能出于各种原因需要使用上下文,但在调用
reset
后,上下文对它们一无所知e、 立即清除它们(理想情况下甚至在调用reset之前),因为它们是定时炸弹,等着你一碰它们就炸毁你的应用程序。

你能发布相关线程堆栈跟踪的图像吗?你使用的是线程限制还是队列限制?你使用的是父子上下文吗?你首先应该确定你为什么要这样做,看看你能不能想出另一个解决方案在大多数情况下,您最好只拆下整个堆栈,并确保持有托管对象的任何对象都会侦听有关堆栈消失的通知,以便它们释放引用。您试图做的事情类似于从摩天大楼上拆下第一层,并希望一切都保持原来的状态。因此是否认为存在此问题是因为存在需要解除分配的恶意上下文?是的,我猜不止一个,正在等待对方解除阻止。调试建议:创建
NSManagedObjectContext
的自定义子类。让它使用从未维护的
NSValue
到其
setPersistentStoreCoordinator:…
dealloc
上的persistent store coordinator,可能还有一些其他信息,可以正确识别上下文。要识别流氓,请检查字典。是的,我同意需要有一种方法来获取属于协调器的所有上下文。我喜欢您使用未恢复的NSV值的集合。
[managedObjectContext performBlockAndWait:^{
    [managedObjectContext reset];
}];