【问题标题】:Manage large object graph creation in CoreData在 CoreData 中管理大型对象图的创建
【发布时间】:2016-03-09 00:46:41
【问题描述】:

我有一个像 Document->Section->Value 这样的对象模型,但 Value 也可以是表类型,所以我有 Value->Row->Column->Value。所以最坏的情况是 Document->Section->Value->Row->Column->Value 这会导致很多对象。

当我从后端收到更新时,我需要将收到的 JSON 膨胀到 CoreData 对象中并保存它,这可能很耗时。更糟糕的是,如果用户离线,可能会出现大量等待更新的队列,这可能需要几分钟或更长时间才能赶上。

例如,我设置了一些计时器来尝试定位“最坏情况”事务,并发现单个文档更新需要 1.3 秒。该文档包含 5 个部分、2 行、14 列和 425 个值。这是大量的对象创建,我并不感到惊讶它需要一段时间。问题是我该如何改进?

我正在考虑迁移到 blob 式存储,其中文档对象像现在一样维护自己的属性,但所有内容对象都只是变成了一个大字典。只有一个对象供 CoreData 创建和保存,应该会使更新更快。

然后我只需要将它膨胀成一个临时对象图,以便在 UI 中显示和交互。这是一个好方法还是有更好的选择?

Realm 也有人向我推荐过,但我想它也会被如此多的嵌套对象所困。

【问题讨论】:

    标签: ios objective-c core-data persistence


    【解决方案1】:

    您可以在后台线程上创建对象。它可能不会更快,但它至少可以让你的主线程保持活动状态,包括 UI。您可以通过创建一个与主托管对象上下文具有不同队列优先级的临时托管对象上下文来轻松做到这一点。下面是一些示例代码:

    NSManagedObjectContext *tmpContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    tmpContext.parentContext = [CoreDataManager sharedManager].managedObjectContext;  //my main managed object context - this might be on your appdelegate (for me its on a singleton)
    [tmpContext performBlock:^
    {
        //Im also using JSON - my json has been converted into a dictionary, then arrays
        NSArray *libraries = [templatesDict objectForKey:@"array"];
        if (libraries)
        {
            //create some objects here using the temporary context, eg:
            AnswerObject *newAnswer = [NSEntityDescription insertNewObjectForEntityForName:kCoreDataAnswer inManagedObjectContext:tmpContext];
        }
    
        // push to parent managed object context
        NSError *error;
        if (![tmpContext save:&error])
        {
            NSLog(@"!!!!!! error saving background context");
        }
    
        // save parent to disk asynchronously
        [[CoreDataManager sharedManager].managedObjectContext performBlock:^{
            NSError *error;
            if (![[CoreDataManager sharedManager].managedObjectContext save:&error])
            {
                NSLog(@"!!!!!!error saving main context");
            }
        }];
    
        //and thats the temp context saved to the main
    }];
    

    或者,我可以建议您根本不要将其保存到 coredata 吗?听起来可能很愚蠢,但这可能是个好主意。我在一家创建处理大量 JSON 的应用程序的公司专业工作,然后创建“答案”对象并将其发送回服务器。虽然我们确实为将返回服务器的数据创建 coredata 对象,但我们不会创建 coredata 对象来表示 json。相反,我们只是将 JSON 留在 NSDictionary 中。如果需要,您可以将 NSDictionaries 保存到 coredata,例如,现在非常简单。 NSDictionaries 完全可以满足您的需求,并且创建 coredata 对象的所有数据处理实际上可能根本不会改善您的应用程序。从长远来看,在我们的案例中不这样做为我们节省了大量时间。

    【讨论】:

    • 我已经在后台线程上执行此操作,否则 UI 将完全没用哈哈。速度是我的问题。将所有数据保存在 NSDictionary 中是我想到的“blob-ish”方法
    • NSDictionaries 在关键方面更适合 JSON:当您的 JSON 发生变化时,您不必担心更改数据结构。 NSDictionaries 与 JSON 一样快速且通用,这使得它们非常适合彼此。虽然将 JSON 放入 coredata 似乎是正确的方法,但实际上从长远来看,它可能会花费您大量的开发时间。 NSDictionary 没有速度问题。
    猜你喜欢
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多