Как "сообщить" родительскому контексту, какие управляемые объекты он должен удалить и / или вставить?

У меня есть родитель NSmanagedObjectContext в основной очереди и ребенок NSManagedObjectContext в частной очереди. Я передаю набор управляемых объектов в родительском контексте его дочернему элементу. Затем дочерний контекст имеет управляемые объекты от своего родителя, а затем в него вставляются новые управляемые объекты. Я выполняю некоторую обработку в частной очереди со всеми управляемыми объектами в дочернем контексте, теми, которые пришли из родительского и его собственных новых, и в конце процесса мне нужно сообщить родителю:

  • Какой из его управляемых объектов нужно удалить
  • Какой из его управляемых объектов необходимо заменить новыми управляемыми объектами в дочернем объекте
  • Какой из управляемых объектов в дочернем объекте нужно вставить в родительский

Возможно ли это сделать с отношениями родитель / ребенок между контекстами? Даже если они принадлежат разным очередям? Или отношения родитель / потомок подходят только для внесения изменений в атрибуты определенных управляемых объектов, но не для удаления и вставки управляемых объектов?

Если не представляется возможным управлять этим сценарием с отношениями родитель / ребенок, каким должен быть подход?

заранее спасибо

РЕДАКТИРОВАТЬ: Примеры, которые я нахожу, просто используют дочерний контекст для редактирования управляемого объекта родителя, а затем применяют изменения к родителю, когда заканчивается издание. Поэтому я не уверен, возможно ли использовать дочерний контекст для удаления или вставки объектов в родительском контексте.

2 ответа

Решение

Вот фрагмент кода (с отсутствующими фрагментами), который выполняет удаление на основе дочерних элементов, а затем передает его родительскому элементу.

[childContext performBlock:^{
    // query array of messages

    // LOTS OF CODE

    // Loop through them and delete each message


    // Loop through each message
    for (id emptyMessage in emptyMessages) {

        i++;
        // Work in ContextBlocks...
        //            [childContext performBlock:^{

        __block AHRSMessage *msg = (AHRSMessage *) [childContext objectWithID:emptyMessage];

        [childContext deleteObject:msg];


        if (i % modFactor == 0) {
            self.percentDone = i / totalRecords;

            NSLog(@"%.1f Saving ...", self.percentDone * 100);


            NSError *error;
            if (![childContext save:&error]) {
                NSLog(@"\n error => %@ \n", [error localizedDescription]);
                NSLog(@" error => %@ ", [error userInfo]);
                [NSException raise:@"Database Write Error" format:@"%@ %@", [error localizedDescription], [error userInfo]];

                //                    abort();
            }

            [parentContext performBlock:^{
                NSError *errrror;
                if (![parentContext save:&errrror]) {
                    NSLog(@"\n error => %@ \n", [error localizedDescription]);
                    NSLog(@" error => %@ ", [error userInfo]);
                    [NSException raise:@"Database Write Error" format:@"%@ %@", [error localizedDescription], [error userInfo]];

                    //                        abort();
                }
            }];
        }

        //            }];

    }

Дочернее сохранение записывает его в память, и для фактической записи на диск необходимо вызвать родительское сохранение. Как видите, я делаю одно за другим - но это не обязательно.

Когда дочерний контекст вызывает save()изменения вносятся в родительский контекст. Это означает, что весь граф объектов родительского контекста обновляется, чтобы отражать состояние дочернего контекста.

Таким образом, вам не нужно ничего делать. Удаленные объекты будут удалены, добавленные объекты будут там, а отредактированные объекты будут обновлены.

Другие вопросы по тегам