Cocoa touch 什么';在iOS中正确使用NSErrorRecoveryAttenting、NSError和UIAlertView是什么?

Cocoa touch 什么';在iOS中正确使用NSErrorRecoveryAttenting、NSError和UIAlertView是什么?,cocoa-touch,ios,error-handling,uialertview,nserror,Cocoa Touch,Ios,Error Handling,Uialertview,Nserror,我很难找到在iOS上同时使用NSError、UIAlertView和nserrorrecovery的正确方法示例。我能找到的大多数文档和示例都涵盖了OSX上的等效功能,其中相关行为由Cocoa集成。但在iOS中,似乎有必要“手工”完成这项工作,我找不到很好的例子来说明这项工作是如何完成的 我非常感谢使用N错误中的信息来支持从报告给用户的N错误恢复尝试的一些最佳实践示例。根据苹果的文档: 重要提示:N错误类在Mac OS X和iOS上都可用。但是,错误响应程序和错误恢复API及机制仅在应用程序工具

我很难找到在iOS上同时使用
NSError
UIAlertView
nserrorrecovery的正确方法示例。我能找到的大多数文档和示例都涵盖了OSX上的等效功能,其中相关行为由Cocoa集成。但在iOS中,似乎有必要“手工”完成这项工作,我找不到很好的例子来说明这项工作是如何完成的


我非常感谢使用N错误中的信息来支持从报告给用户的
N错误
恢复尝试的一些最佳实践示例。

根据苹果的文档:

重要提示:N错误类在Mac OS X和iOS上都可用。但是,错误响应程序和错误恢复API及机制仅在应用程序工具包(Mac OS X)中可用

因此,我不确定您是否可以使用
nserrorRecoveryAttenting
,即使文档中确实定义了它(看起来这是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;
}

我试图在UIKit中镜像AppKit的错误处理机制,主要是因为我想利用响应器链向上转发错误。我还没有完全测试过这个,但目前它看起来像下面这样

它非常贴切地反映了AppKit,但是will/did钩子可以被覆盖,分别执行自定义错误表示和恢复。默认行为是显示UIAlertView进行演示,并使用psuedo NSErrorRecoveryAttenting对象进行恢复

@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

我发现了一个很好的例子

请参阅以下由James Beith撰写的博客文章和GitHub代码(包括示例项目)


我能够在iPhone模拟器上成功地使用它。

有一次我编写了代码来实现这一点(使用UIAlertView等处理显示N错误),但我还没有看到一个错误,它实际上有一个
恢复试探器
,所以我不知道它是否真的正确。因为N错误恢复试探是一个非正式的协议,要使一个对象符合要求,只需实现这两种方法。iOS上的NSError肯定包含必要的属性和常量。苹果的评论显然只是指所描述的特定appkit方法,而.nserrorRecovery在iOS上运行良好。您可以在N错误标题中看到它。缺少的是将错误传递给MacOS X上的警报的功能-通过在UIAlertView上添加一个执行错误恢复的类别,这是非常容易做到的,并且有几个例子说明了如何做到这一点。您在2018年对此有何看法?