第二个内存存储作为缓存

时间:2011-02-16 13:06:10

标签: multithreading core-data

亲爱的社区。 我尝试发现使用2个持久性存储来提高应用程序性能的机会。 我在这做什么: 创建2个持久性商店

persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:[NSNumber numberWithBool:YES] 
         forKey:NSMigratePersistentStoresAutomaticallyOption];

if (![persistentStoreCoordinator addPersistentStoreWithType:NSInMemoryStoreType
                                              configuration:nil 
                                                        URL:[NSURL URLWithString:@"memory://store"]
                                                    options:dict 
                                                      error:&error])
{
    [[NSApplication sharedApplication] presentError:error];
    [persistentStoreCoordinator release], persistentStoreCoordinator = nil;
    return nil;
}

if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                              configuration:nil 
                                                        URL:url
                                                    options:dict 
                                                      error:&error])
{
    [[NSApplication sharedApplication] presentError:error];
    [persistentStoreCoordinator release], persistentStoreCoordinator = nil;
    return nil;
}

将新创建的对象分配到内存中

NSManagedObject *objectCarrier = [NSEntityDescription 
                                  insertNewObjectForEntityForName:@"Carrier" 
                                  inManagedObjectContext:managedObjectContext];
[objectCarrier setValue:startForCarrier
                 forKey:@"name"];
NSURL *url = [NSURL URLWithString:@"memory://store"];
[managedObjectContext assignObject:objectCarrier
                        toPersistentStore:[[appDelegate persistentStoreCoordinator] persistentStoreForURL:url]];

保存最终对象

使用内存和特定持久性存储之间的区别是 我错误地使用谓词中的对象来获得相同的代码。 如果我只是更改持久存储类型,我拾取对象:

NSManagedObject *destination = [[codeAfterComparing lastObject] valueForKey:codeRelationshipName];            

但是此对象的设置值不起作用。 如果我尝试为接收的对象分配对象,我有错误(这没关系,这个对象如何保存为inMemory或asSqlLite存储对象,每次都会启动错误。)

  

2011-02-16 14:32:45.037雪   服务器[44411:1803] * 终止应用程序   由于未被捕获的例外   'NSInvalidArgumentException',原因:   '无法将对象重新分配给   一旦它出现了不同的商店   保存'。

尝试使用两个不同的存储保存最终对象的图形会给我一个错误“CoreData不支持持久的跨存储关系”,并且无关紧要,即固有对象在哪里。 迁移如下:

    for (NSPersistentStore *persistentStore in [persistentStoreCoordinator persistentStores]) {
        if (persistentStore.type == NSInMemoryStoreType) {

            // migrate the in-memory store to a SQLite store
            NSError *error;

           [persistentStoreCoordinator migratePersistentStore:persistentStore toURL:[NSURL fileURLWithPath:[[self applicationSupportDirectory] stringByAppendingPathComponent:@"storedata.sql"]] options:nil withType:NSSQLiteStoreType error:&error];
            if (! newPersistentStore) {

产品错误:“无法两次添加同一商店”

所以,结果对我来说很奇怪: 1.看起来托管对象上下文对于2个商店之间的对象没有区别。如果我问保存,它需要整个对象并保存相同的sqlite存储 2.也许是使用不同持久性商店协调员的方法但我不确切知道,如何在2个商店之间轻松转移对象。当然,我可以复制一份(包括关系e.t.c.),但这是这个简单问题的硬编码,我想。

也许有人可以建议我的代码错误或代码的良好工作示例来审查和理解在内核缓存中使用核心数据的好方法?谷歌搜索没有提供太多的例子。

3 个答案:

答案 0 :(得分:1)

如果您查看Apple网站上的Core Recipe example code,他们会使用多个商店将对象保存在内存和磁盘上。

答案 1 :(得分:0)

以为我会在这里捅一下。

过去我遇到过这个问题。我最终删除了同一协调器中两个持久存储的功能。如果我正确理解Apple,则不能在持久存储之间共享对象实体。因此,为了使事情变得更容易,我通常只是执行以下操作(尽管我怀疑使用额外的协调器存在效率问题)

  • NSPersistentStoreNSPersistentStoreCoordinator

  • 将暂存器工作分解为NSManagedObjectContext s

  • NSManagedObject子类

  • 创建深层复制方法

然后,当您管理每个持久存储的任何类都使用复制功能来导入托管对象时。

我真的不能想到一个实例,你想要经历一个额外的麻烦,即将托管对象单独分配给一个不会被这种方式带走的特定商店。

我有一个程序,它使用两个存储 - 一个在内存中用于临时对象,另一个用于管理文档。它运作得很好。

答案 2 :(得分:0)

在iOS 5 Apple中引入Nested Managed Object Contexts,您可以在其中使用两个托管对象上下文。

这可能会替换您在内存存储中的方法,例如您现在可以使用(也)新的并发类型之一在后台运行一个上下文(例如,用于后台提取),另一个作为主要上下文。

查看WWDC2011 Session 303