NSManagedObjectContext не обновляется правильно

привет :) У меня такая же проблема, как и в Работа с одним и тем же NSManagedObjectContext на нескольких вкладках
фон:
Мой managedObjectContext (далее MOC) инициализируется в моем классе appDelegate и передается на несколько вкладок с помощью
myViewController.managedObjectContext = self.managedObjectContext; или в методе инициализации с self.managedObjectContext = pContext; ] поток такой: первое представление - это простой список коллекций. Коллекции извлекаются с помощью NSFetchedResultsController ( myViewController: UITableViewController ). Выбирая один, вы перемещаетесь глубже, но все же проходите этот MOC.
В следующем контроллере (detailsViewController) я перечисляю некоторые элементы этой коллекции, с которыми я могу взаимодействовать (например, установить переключатели).
У меня также есть EditObjectContext:

// DetailsViewController.m
NSManagedObjectContext* editingContext = [[NSManagedObjectContext alloc] init];
[editingContext setPersistentStoreCoordinator:[managedObjectContext persistentStoreCoordinator]];
self.editingObjectContext = editingContext;

Теперь моя проблема: поскольку мое представление должно вращаться, я использую следующий трюк:

// DetailsViewController.m
DetailsView *localAct = [[DetailsView alloc] initWithManagedObjectContext:managedObjectContext ... ]
DetailsView *localSen = [[DetailsView alloc] initWithManagedObjectContext:managedObjectContext ... ]

UITableView *localContainerView = [[UITableView alloc] init];
self.containerView = localContainerView;
[localContainerView release];
//[...]
[containerView addSubview:actuatorView];
self.tableView = containerView;

далее у меня есть кнопка для управления этими элементами (какие из них должны отображаться, а какие нет) . Эта кнопка просто перезагружает таблицу с новым результатом fetchResult.

// DetailsView.m
- (void) manageItems{
managing = !managing;
[viewController setIsManaging:managing]; // parent
self.fetchedResultsController = nil;

NSError *error = nil;
[[self fetchedResultsController] performFetch:&error];

[self reloadData];
[self updateBarButton];
}

Метод помещения элементов в контекст выглядит так:

// DetailsViewController.m
(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// init + create predicate
NSSet* set = [sen filteredSetUsingPredicate:predicate];
if( [set count] > 0 )
{
    for( Act* act in set )
    {
        [editingObjectContext deleteObject:act];
    }
}
else
{
    Act* act = [NSEntityDescription insertNewObjectForEntityForName:@"Act" inManagedObjectContext:editingObjectContext];

    // do things
}
NSError *error = nil;
[[detailView fetchedResultsController] performFetch:&error];

[self.containerView reloadData];
[detailView reloadData];
}

но после того, как я выбрал элементы в управляемом представлении и нажал кнопку «Сохранить» (manageItems), представление не t показать их: / мне нужно переключить вкладку или перейти в другой контроллер (родительский или более глубокий), чтобы актуализировать его. мой метод ViewWillAppear:

// DetailsViewController.m
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
DetailsView *detailView = se ? senView : actView;
// [do uninteresting stuff]
[detailView.fetchedResultsController performFetch:nil];
[self.tableView reloadData];
// [do uninteresting stuff]
}

и вызовы viewWillDisapper

- (void)saveChanges
{
if( ![editingObjectContext hasChanges] )
    return;

// send save-command to server
}

В более ранней версии Verison, где было только одно представление, он работал, и я не сильно изменился ...: / поэтому я не понимаю, почему MOC действует как оно делает. Часть "manageItems" почти такая же, в новой версии она просто на уровень глубже (в DetailsView вместо контроллера) ...

если кто-то может сказать мне, что я могу попробовать (всегда сохраняю на сервер при переключении между управление и нормальный режим не являются решением, потому что задержка ответа от сервера слишком велика для обновления, поэтому у меня меньше возможностей переворачивать представление. Также обновление представлений с помощью self.tableView / detailView / self.containerView refresh приносит тот же результат: /).

и вторая проблема: я не могу вызвать метод «editObjectContext save:» после отправки на сервер, потому что он выдает ошибки и вообще не сохраняет в локальную базу данных.

Ошибка в handleChangeResponse: Error Domain = NSCocoaErrorDomain Code = 133020 «Операция не может быть завершена. (Ошибка какао 133020.)» UserInfo = 0x4d8bb90 {конфликтList = ( "NSMergeConflict (0x5a2fac0) для NSManagedObject (0x5a46a80) с objectID '0x5a46420' с oldVersion = 7 и newVersion = 8 и снимком старого объекта = {\ n iconName = noicon; \ n [...]; \ n} и новой кэшированной строкой = {\ n iconName = noicon; \ n [...] \ n} " )}

если у вас есть вопросы или вам нужен дополнительный код (например, более старая версия), просто спросите;)

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

5
задан Community 23 May 2017 в 12:31
поделиться