【问题标题】:Child ManagedObjectContext with NSPrivateQueueConcurrencyType after resetting parent PersistenceStoreCoordinator重置父 PersistenceStoreCoordinator 后具有 NSPrivateQueueConcurrencyType 的子 ManagedObjectContext
【发布时间】:2012-06-21 06:40:02
【问题描述】:

当用户登录我的应用程序时,我会在后台线程中从服务器下载一些数据。 我有一个单例,将其 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;
}

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

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

但如果我注销/停止应用程序/重新启动应用程序/登录,它可以正常工作。

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

是否有任何最佳实践来重置所有 managedobjectcontexts、删除 storecoordinator 文件并“重新启动”所有核心数据堆栈?

感谢您的帮助。

【问题讨论】:

  • 你期望做什么 _persistentStoreCoordinator = [self persistentStoreCoordinator]; ?顺便说一句,为什么在这里使用 [self persistentStoreCoordinator] 而不是你在其他地方使用的 self.persistentStoreCoordinator?

标签: ios core-data nsmanagedobjectcontext


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多