首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在NSPersistentStore跟踪更改时重新发送NSFetchedResultsController后崩溃

在NSPersistentStore跟踪更改时重新发送NSFetchedResultsController后崩溃
EN

Stack Overflow用户
提问于 2012-02-10 14:21:22
回答 3查看 2.3K关注 0票数 3

我想做的是:

我使用them

  • NSFetchedResultsController使用NSFetchedResultsController执行一个获取和跟踪更改,使用它的委托

  • ,我下载了一些数据,并根据某些条件,有时通过删除NSPersistentStore并重新创建一个新的CoreData来删除CoreData存储的所有本地数据。

相反,当我试图保存数据时,我得到的是这个崩溃:

CoreData:错误:严重的应用程序错误。在核心数据更改处理过程中捕获了异常。这通常是NSManagedObjectContextObjectsDidChangeNotification.观察者中的一个bug。对象的持久存储无法从这个NSManagedObjectContext的协调器中用userInfo访问(null)

我总是使用单个NSManagedObjectContext,并且总是在主线程上读取和保存。

似乎切换NSPersistenStore在某种程度上扰乱了获取结果控制器。这是预期的行为还是我做错了什么?

EN

回答 3

Stack Overflow用户

发布于 2012-02-10 14:33:56

我不建议这样做。我会创建一个新的MOC与您的新持久存储,并放弃旧的MOC。

我想在某个时候你叫-[ManagedObjectContext reset]?在这样做之前,您必须放弃来自该上下文的所有托管对象。它们都会变得无效(这很可能是造成您崩溃的原因)。

您还应该看看How to force coredata to rebuild sqlite database model?

票数 3
EN

Stack Overflow用户

发布于 2012-04-28 16:05:08

我也经历过同样的车祸。按照罗布的建议,每次打电话给removePersistentStore:时,我都会发布一个removePersistentStore:,而所有拥有NSFetchedResultController的ViewControllers现在都会自动取消本地NSFetchedResultsController。

即:

1-听取通知:

代码语言:javascript
复制
-(id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
    // Custom initialization
    [[NSNotificationCenter defaultCenter] addObserverForName:kNotificationDestroyAllNSFetchedResultsControllers object:nil queue:nil usingBlock:^(NSNotification *note) {
        NSLog(@"[%@] must destroy my nsfetchedresultscontroller", [self class]);
        [__fetchedResultsController release];
        __fetchedResultsController = nil;
        }];
    }
    return self;
}

2-邮寄通知

代码语言:javascript
复制
for( NSPersistentStore* store in [self.persistentStoreCoordinator persistentStores] )
{
    NSError *error;
    NSURL *storeURL = store.URL;
    [self.persistentStoreCoordinator removePersistentStore:store error:&error];
    [[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error];

    /** ... side effect: all NSFetchedResultsController's will now explode  */
    [[NSNotificationCenter defaultCenter] postNotificationName:kNotificationDestroyAllNSFetchedResultsControllers object:self];
}
票数 2
EN

Stack Overflow用户

发布于 2017-04-26 06:59:55

NSFetchedResultsController监视其关联的托管对象上下文中对象的更改,因此它可能监视过时的托管对象上下文中的对象更改。

当我在重置NSFetchedResultsController后重新创建NSPersistentStore时,这个问题得到了修复。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9229228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档