相关疑难解决方法(0)

核心数据:子上下文是否为新插入的对象获取永久的objectID?

我有一个应用程序有两个托管对象上下文设置如下:

  • 父上下文:NSPrivateQueueConcurrencyType,链接到持久性存储.
  • 主要上下文:NSMainQueueConcurrencyType,父上下文的子项.

当将新的托管对象插入主上下文时,我保存主上下文,然后保存父上下文,如下所示:

[context performBlockAndWait:^{
    NSError * error = nil;
    if (![context save: &error]) {
        NSLog(@"Core Data save error %@, %@", error, [error userInfo]);
    }
}];

[parentContext performBlock:^{
    NSError *error = nil;
    BOOL result = [parentContext save: &error];
    if ( ! result ) {
        NSLog( @"Core Data save error in parent context %@, %@", error, [error userInfo] );
    }
}];
Run Code Online (Sandbox Code Playgroud)

我的理解是,当首次创建管理对象时,它具有临时性objectID.然后保存主上下文,并且此对象及其临时ID将转到父上下文.然后保存父上下文.保存最后一个上下文后,objectID父上下文中的临时变换为永久变形objectID.

所以:

  • 永久对象ID是否会自动传播回主(子)上下文?
  • 当我强制获取对象永久ID时 [NSManagedObjectContext obtainPermanentIDsForObjects:error:],然后对应用程序进行后台处理,重新激活它,重新加载,使用主要上下文获取对象objectWithID:,并访问属性,我得到

    "CoreData无法解决......".

这种方法有什么问题?

concurrency nested core-data nsmanagedobjectcontext ios

29
推荐指数
2
解决办法
5766
查看次数

使用父/子上下文时,批处理大小不起作用

我已经能够在我的应用程序上确认这一点,并且我创建了一个快速示例应用程序来确认这一点.这是设置:

您有两个托管对象上下文:

masterMOC: NSPrivateQueueConcurrencyType, tied to persistent store coordinator
mainMOC: NSMainQueueConcurrencyType, child of masterMOC, NOT tied to any store coordinator
Run Code Online (Sandbox Code Playgroud)

此设置的灵感来自WWDC视频,它建议我们可以通过将其设置masterMOC为专用队列并将其绑定到持久性存储来保存后台线程.如果你设置了一个NSFetchedResultsController使用mainMOC(并且它必须是mainMOC那个与UI绑定的那个),并设置a fetchBatchSize,则忽略批量大小并且所有实体立即出现故障.我启用了SQLite调试注释,当滚动数千行(批量大小为20)时,没有任何错误被触发.

如果我进行一个简单的调整,即将持久性存储协调器绑定到mainMOC并使其成为根上下文(即,它不再是master的子节点),那么批量大小完美地工作,并且当我滚动数千行时,几个故障被解雇了.

这是预期的行为吗?我错过了什么吗?

您可以在此处下载示例项目

iphone core-data objective-c ios

10
推荐指数
1
解决办法
1931
查看次数