UIManagedDocument — проверка основного объекта данных

У меня есть приложение, которое использует Core Data и получает свой ManagedObjectContext с помощью UIManagedObject. Из чтения я вижу, что я не должен сохранять контекст напрямую - скорее, я должен зависеть от автоматического сохранения UIManagedObject или использовать saveToURL:... Моя проблема в том, что я хочу проверить данные, хранящиеся в моем объекте. У меня есть ограничения на сущность, которые указывают, что минимальная длина строковых свойств равна 1. Однако я могу создать новый объект, присвоить его свойствам пустые строки и сохранить файл. В обработчике завершения saveToURL:... он всегда имеет истинное значение успеха. Затем я создал свой собственный валидатор для свойства name моей сущности. Я использовал пример кода из Core Data Programming Guide —

-(BOOL)validateName:(id *)ioValue error:(__autoreleasing NSError **)outError 

{
    if (*ioValue == nil) 

    {
        if (outError != NULL) 

        {
            NSString *errorStr = @"nil error";

            NSDictionary *userInfoDict = [NSDictionary dictionaryWithObject:errorStr

                forKey:NSLocalizedDescriptionKey];

            NSError __autoreleasing *error = [[NSError alloc] initWithDomain:@"domain"

                code:1

                userInfo:userInfoDict];

            *outError = error;

        }

        return NO;

    }

    else if( [*ioValue length] == 0 )

    {

        if (outError != NULL) {

            NSString *errorStr = @"length error";

            NSDictionary *userInfoDict = [NSDictionary dictionaryWithObject:errorStr

                forKey:NSLocalizedDescriptionKey];

            NSError __autoreleasing *error = [[NSError alloc] initWithDomain:@"domain"

                code:1

                userInfo:userInfoDict];

            *outError = error;

        }

        return NO;

    }

    else

    {

        return YES;

    }

}

Когда это запускается, я вижу, что ioValue имеет нулевую длину и возвращает NO, но тогда мой обработчик завершения никогда не вызывается. Любая помощь будет здорово.

Есть ли что-то, чего мне не хватает для обработки ошибок сохранения с помощью UIManagedDocument, в частности, как уведомить вызывающий код о том, что произошла ошибка при сохранении его информации.


person Brian    schedule 03.02.2012    source источник


Ответы (2)


Как правило, вы должны вызывать saveToURL только для создания нового файла. Пусть автосохранение сделает все остальное.

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

Непосредственно из документации:

Объект UIDocument находится в определенном состоянии в любой момент своего жизненного цикла. Вы можете проверить текущее состояние, запросив свойство documentState. И вы можете получать уведомления об изменениях в состоянии документа, наблюдая за уведомлением UIDocumentStateChangedNotification.

person Jody Hagins    schedule 17.04.2012

Думаю, мне нужно реализовать handleError:(NSError *)error userInteractionPermitted:(BOOL)userInteractionPermitted в подклассе UIManagedDocument. Я узнал об этом из этой статьи — http://blog.stevex.net/2011/12/uimanageddocument-autosave-troubleshooting/

person Brian    schedule 13.11.2012