Метод сохранения в NSManagedObjectContext занимает много времени, если я назначаю отношения - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть две разные NSManagedObjects, которые я пытаюсь сохранить в базовые данные (по 100–200 тыс. Записей каждая).У первого списка есть клиенты, у второго - проекты.Между клиентом и проектом существует множество отношений.

Если я зацикливаюсь на проектах и ​​назначаю отношениям с клиентами метод [context save:], который будет длиться вечно (более 8 минут, как правило, приложение вылетает из памяти, прежде чем завершится.)

Если я прокомментирую назначение отношения (для целей тестирования мне нужно, чтобы отношение было назначено в этой точке кода.), Тогда метод [context save:] займет всего пару секунд.Я почти уверен, что данные ядра могут обработать его лучше, так что я упускаю?

** Примечание: я возвращаю каждый объект к ошибке сразу после назначения, вызывая [context refreshObject:] check https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CoreData/FaultingandUniquing.html для получения более подробной информации **

NSManagedObjectContext* context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    context.parentContext = [self moc];

    [projectsJSON enumerateKeysAndObjectsUsingBlock:^(id key, id projectJSON, BOOL *stop) {

        Project* project = [self Project* project = projectManagedObjectFromJSON:projectJSON inContext:context];

        //there's a dictionary of loaded customers in memory
        Customer *customer = customers[projectJSON[@"customer_primary_key"]];

        [customer addProjectsObject:project];
        project.customer = customer;
        [context refreshObject:customer mergeChanges:NO];
    }];
    /*if you comment the last three lines, save will take 1-2 seconds for 100k projects. It currently takes 8+ minutes*/
    [context save:&err];

Я ожидаю, что метод [context save:] этого не сделает, но в результате я назначаю отношения вечно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...