在CoreData

时间:2016-03-08 04:32:46

标签: ios objective-c core-data persistence

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

当我从后端收到更新时,我需要将收到的JSON膨胀到CoreData对象并保存它,这可能非常耗时。更糟糕的是,如果用户已经离线,可能会有大量的更新待处理,这可能需要几分钟或更长时间才能赶上。

作为一个例子,我设置了一些定时器来尝试找出最坏的情况'交易并发现单个文件更新耗时1.3秒。该文档包含5个部分,2行,14列和425个值。这是很多对象的创造,我并不感到意外需要一段时间。问题是如何改善这一点?

我正在考虑迁移到blob-ish类型的存储,其中文档对象像现在一样维护自己的属性,但所有内容对象只是变成一个大字典。只需要一个CoreData对象来创建和保存,就可以使更新更快。

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

Realm也被建议给我,但我想它也会因为这么多嵌套对象而陷入困境。

1 个答案:

答案 0 :(得分:0)

您可以在后台线程上创建对象。它可能不会更快但它至少会允许您的主线程保持活动状态,包括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的应用程序,然后创建“回答”#39;对象并将它们发送回服务器。虽然我们为将返回服务器的数据创建coredata对象,但我们不创建coredata对象来表示json。相反,我们只是将JSON保留在NSDictionary中。如果需要,您可以将NSDictionaries保存到coredata,例如,非常简单地将其保存到父对象。 NSDictionaries非常快速地满足您的需求,创建coredata对象时的所有数据处理实际上可能根本无法改善您的应用程序。在我们的案例中没有做到这一点从长远来看为我们节省了大量时间。