Ios 重置父PersistenceStoreCoordinator后具有NSPrivateQueueConcurrencyType的子ManagedObjectContext
当用户登录到我的应用程序时,我会在后台线程中从服务器下载一些数据。 我有一个将其managedObjectContext设置为主managedObjectContext的子对象的单例Ios 重置父PersistenceStoreCoordinator后具有NSPrivateQueueConcurrencyType的子ManagedObjectContext,ios,core-data,nsmanagedobjectcontext,Ios,Core Data,Nsmanagedobjectcontext,当用户登录到我的应用程序时,我会在后台线程中从服务器下载一些数据。 我有一个将其managedObjectContext设置为主managedObjectContext的子对象的单例 -(NSManagedObjectContext*) context{ if(!_context){ NSManagedObjectContext *child = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSPrivat
-(NSManagedObjectContext*) context{
if(!_context){
NSManagedObjectContext *child = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[child setParentContext:[MyAppDelegate delegate].managedObjectContext];
_context = child;
}
return _context;
}
当用户注销时,我将删除锁定主managedobjectcontext的PersistenceStoreCoordinator sqllite文件
-(void)onLogout{
NSError *error = nil;
if ([_persistentStoreCoordinator persistentStores] == nil)
return;
[self.managedObjectContext reset];
[self.managedObjectContext lock];
NSPersistentStore *store = [[self.persistentStoreCoordinator persistentStores] lastObject];
if (![self.persistentStoreCoordinator removePersistentStore:store error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
// Delete file
if ([[NSFileManager defaultManager] fileExistsAtPath:store.URL.path]) {
if (![[NSFileManager defaultManager] removeItemAtPath:store.URL.path error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
_persistentStoreCoordinator = nil;
_persistentStoreCoordinator = [self persistentStoreCoordinator];
[self.managedObjectContext unlock];
self.agendaLoader = nil;
_agendaLoader = self.agendaLoader;
}
如果我在同一模拟器会话中注销/登录(不停止应用程序),singleton中的save方法将崩溃,并出现以下错误:
This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.'
但是,如果我注销/停止应用程序/重新启动应用程序/登录,它就可以正常工作
我尝试在注销时重置子managedobjectcontext,但没有任何结果
是否存在重置所有ManagedObjectContext、删除storecoordinator文件和“重新启动”所有核心数据堆栈的最佳做法
谢谢你的帮助 我认为通知是你最好的选择。持有托管对象上下文引用的每个视图控制器或对象以及任何托管对象都必须遵守重置的自定义通知。因为所有这些都将无效
我只是好奇,您需要删除持久存储文件的原因是什么?是出于隐私还是出于安全原因?如果只是数据的临时性质?您希望做什么_persistentstorecordinator=[self persistentstorecordinator]?顺便问一下,为什么在这里使用[self-persistentStoreCoordinator],而不是在其他地方使用self.persistentStoreCoordinator?