重置父PersistenceStoreCoordinator后具有NSPrivateQueueConcurrencyType的子ManagedObjectContext

时间:2012-06-21 06:40:02

标签: ios core-data nsmanagedobjectcontext

当用户登录我的应用程序时,我会在后台线程中从服务器下载一些数据。 我有一个单例,它将managedObjectContext设置为主要managedobjectcontext的子元素。

-(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;
}

如果我在相同的模拟器会话中注销/登录(不停止应用程序),单例中的save方法崩溃并出现以下错误:

This NSPersistentStoreCoordinator has no persistent stores.  It cannot perform a save operation.'

但如果我退出/停止app /重新启动app / login,它的工作没有任何问题。

我尝试在注销时重置子managedobjectcontext而没有任何结果..

是否有任何最佳做法可以重置所有managedobjectcontexts,删除storecoordinator文件,并“重新启动”所有核心数据堆栈?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我认为通知是您的最佳选择。保存对托管对象上下文以及任何托管对象的引用的每个视图控制器或对象都必须遵守重置的自定义通知。因为所有这些都将失效。

我只是好奇,你需要删除持久存储文件的原因是什么?是出于隐私还是出于安全原因?如果仅仅是数据的临时性质?