Как правильно использовать NSErrorRecoveryAttempting, NSError и UIAlertView в iOS?

Я не могу найти примеры как правильно использовать NSError, UIAlertView и NSErrorRecoveryAttempting вместе с iOS. Большая часть документации и примеров, которые я могу найти, охватывает эквивалентные функции в OS X, где соответствующие поведения интегрированы Cocoa. Но в iOS, похоже, необходимо сделать это "вручную", и я не могу найти хороших примеров того, как это делается.

Я был бы очень признателен за несколько примеров наилучшей практики использования информации в NSError для поддержки попытки восстановления из NSErrors сообщается пользователю.

3 ответов


согласно документации Apple:

важно: класс NSError доступен как в Mac OS X, так и в iOS. Однако API и механизмы реагирования на ошибки и восстановления ошибок доступны только в наборе приложений (Mac OS X).

Итак, я не уверен, что вы можете использовать NSErrorRecoveryAttempting хотя он, похоже, определен в документации (похоже, это область документов UIKit, которые еще не были обновлены после копирования из Документация по AppKit).

вот как я обрабатываю ошибки в своем коде:

NSError *error = nil;
id result = [SomeClass doSomething:&error];

if (!result) {
    NSLog(@"Do something failed: %@", error);
    UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Something failed!" message:@"There was an error doing something." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] autorelease];
    [alert show];
    return;
}

Я нашел отличный пример этого.

см. следующее сообщение в блоге и код GitHub (включая пример проекта) Джеймса Бейта

http://www.realmacsoftware.com/blog/cocoa-error-handling-and-recovery

https://github.com/realmacsoftware/RMErrorRecoveryAttempter

Я смог успешно использовать это на симуляторе iPhone.


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

он отражает AppKit довольно близко, но крючки will/did могут быть переопределены для выполнения пользовательского представления ошибок и восстановления соответственно. Поведение по умолчанию-показать UIAlertView для презентации и использовать psuedo-объект nserrorrecoveryattempting для восстановления.

@implementation UIResponder (ErrorHandling)

- (void)presentError:(NSError *)error
        completion:(void (^)(BOOL recovered))completion
{
    if (nil == (error = [self willPresentError:error])) {
        return;
    }
    if (self.nextResponder) {
        [self.nextResponder presentError:error completion:completion];
        return;
    }

    // Code to create and show UIAlertView
    // e.g. https://github.com/jayway/CWUIKit/blob/master/Classes/UIAlertView%2BCWErrorHandler.m

    // The UIAlertViewDelegate calls didPresentError...
}

/*
 Override to customise the error object as in AppKit.
 You can also perform your own error presentation, and return nil to terminate the default handling.
 Custom error presentation UI should still call didPresentError... when dismissed
 */
- (NSError *)willPresentError:(NSError *)error
{
    return error;
}

/*
 Override to perform custom error recovery.
 */
- (void)didPresentError:(NSError *)error optionIndex:(NSInteger)optionIndex completion:(void (^)(BOOL recovered))completion
{
    id recoveryAttempter = [error recoveryAttempter];
    if ([recoveryAttempter respondsToSelector:@selector(attemptRecoveryFromError:optionIndex:completion:)]) {
        [recoveryAttempter attemptRecoveryFromError:error optionIndex:optionIndex completion:completion];
    }
}

@end