Отменить менеджер, не обновленный с NSPersistentDocument - PullRequest
0 голосов
/ 09 октября 2011

У меня есть некоторые вычисленные значения в базе данных основных данных, которые мне нужно обновить непосредственно перед сохранением.В основном я нумерую некоторые объекты, чтобы облегчить навигацию между ними.

В настоящее время я наблюдаю NSManagedObjectContextWillSaveNotification и пытаюсь сделать эту нумерацию там.Казалось бы, изменения, которые я делаю, сохраняются, но менеджер отмены все еще имеет некоторые изменения.Это заставляет документ выглядеть так, как будто в нем есть изменения (отметка на кнопке закрытия), даже если в контексте управляемого объекта сказано, что в нем нет (hasChanges).Если я отменю один раз, документ выглядит так, как будто в нем нет изменений, но, в свою очередь, контекст управляемого объекта.

Менеджер отмены каким-либо образом сбрасывает себя в неправильном месте или я что-то делаю неправильно?

Обновление

Несколько запутанный код, в котором я делаю эту нумерацию, выглядит так:

- (void)managedObjectContextWillSave:(NSNotification *)notification
{
    // Force the content view controller to save any pending changes.
    [_contentViewController saveChanges];

    NSArray *itemSortDesc = [self sortDescriptorsForSomeItem];
    NSArray *items = [SomeItem findAllObjectsInContext:self.managedObjectContext
                                             andSortBy:itemSortDesc];
    NSUInteger i = 0;
    for (SomeItem *i in items)
    {
        i.uid = [NSNumber numberWithUnsignedInteger:i++];
    }
}

_contentViewController содержит текстовое поле, котороебудет проанализирован для нескольких экземпляров SomeItem.

1 Ответ

0 голосов
/ 11 октября 2011

Я предполагаю, что ваша нумерация влияет на стек отмены.

Возможно, я бы попытался обработать это в NSManagedObject willSave вместо использования NSManagedObjectContextWillSaveNotification, но я подозреваю, что это не решит вашу проблему.

Вы можете попробовать это:

[[self.managedObjectContext undoManager] disableUndoRegistration];

// do the renumbering

[self.managedObjectContext processPendingChanges];
[[self.managedObjectContext undoManager] enableUndoRegistration];

Я использую это, чтобы не испачкать новый документ во время инициализации. Я не уверен, что он будет работать правильно для сохранения, но, возможно, стоит попробовать.

...