3

我正在构建一个通过移动 SAAS - Parse 登录的应用程序。

登录请求可能会返回多个错误代码。目前为每个错误代码运行一个 if 语句并显示一个相关的警报视图,如下所示:

        if (error == nil) {
            // Something went wrong
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"LoginAlertErrorTitle", @"Login Error Alert View Title") message:NSLocalizedString(@"LoginStandardError", @"Login error message text - standard error") delegate:self cancelButtonTitle:nil otherButtonTitles:NSLocalizedString(@"GlobalOKButtonTitle", @"Global Ok button title"), nil];
            [alertView show];
        } else  if ([error code] == kPFErrorObjectNotFound) {
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"LoginAlertErrorTitle", @"Login Error Alert View Title") message:NSLocalizedString(@"LoginErrorObjectNotFound", @"Login error message text - object not found") delegate:self cancelButtonTitle:nil otherButtonTitles:NSLocalizedString(@"GlobalOKButtonTitle", @"Global Ok button title"), nil];
            [alertView show];
        } else  if ([error code] == kPFErrorConnectionFailed) {
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"LoginAlertErrorTitle", @"Login Error Alert View Title") message:NSLocalizedString(@"LoginAlertErrorConnection", @"Login error message text - connection failed") delegate:self cancelButtonTitle:nil otherButtonTitles:NSLocalizedString(@"GlobalOKButtonTitle", @"Global Ok button title"), nil];
            [alertView show];
        } else {
            NSLog(@"A Login error occurred: %i",[error code]);
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"LoginAlertErrorTitle", @"Login Error Alert View Title") message:[[error userInfo] objectForKey:@"error"] delegate:self cancelButtonTitle:nil otherButtonTitles:NSLocalizedString(@"GlobalOKButtonTitle", @"Global Ok button title"), nil];
            [alertView show];
        }

有没有更有效的方法来处理大小写/切换?

实际的错误代码设置如下:

/*! @abstract 100: The connection to the Parse servers failed. */
extern NSInteger const kPFErrorConnectionFailed;

这让我觉得我可以在案例陈述中进行设置。这将是解决此问题的正确/最佳方法吗?它应该像handleErrorAlert:可能那样采用单独的方法吗?

我将如何在上面的示例中编写此开关?

4

3 回答 3

10

在这种情况下,您是否使用switch声明或一系列if-else if实际上只是一个品味问题。是的,该switch语句的效率稍高一些,但在这种情况下,它真的没关系(这不像你每秒调用数千次)。使用您认为更具可读性的内容。

你可能想稍微重构一下你的警报视图代码——在所有情况下你都在做同样的事情,只是错误消息不同,所以有很多重复的代码。你可以像这样重构它:

NSString *errorMessage = nil;
if (error == nil) {
    errorMessage = NSLocalizedString(@"LoginStandardError", @"Login error message text - standard error");
} else {
     switch ([error code]) {
          case kPFErrorObjectNotFound:
               errorMessage = NSLocalizedString(@"LoginErrorObjectNotFound", @"Login error message text - object not found");
               break;
          case kPFErrorConnectionFailed:
               errorMessage = NSLocalizedString(@"LoginAlertErrorConnection", @"Login error message text - connection failed");
               break;
          default:
               errorMessage = [[error userInfo] objectForKey:@"error"];
     }
}
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"LoginAlertErrorTitle", @"Login Error Alert View Title") 
                                                    message:errorMessage
                                                   delegate:self
                                          cancelButtonTitle:nil
                                          otherButtonTitles:NSLocalizedString(@"GlobalOKButtonTitle", @"Global Ok button title"), nil];
[alertView show];
于 2013-04-16T13:01:35.770 回答
4

typedef enum在 a 上使用A switch,我认为这将是最干净的方式。像这样的东西:

typedef enum
{
kServerError,
kInternetError,
kUnknowError
} kTypeError;

switch (aTypeError)
{
.
.
.
}

在您的特定情况下,您需要注意switch...里面的消息UIAlertView是一个共同的部分。所以:

NSString *aTitle = nil;
NSString *aMessage = nil;

switch (aTypeError)
{
    case kUnknowError:
    {
        aTitle = ...;
        aMessage = ...;
    }
    break;
}

UIAlertView *alertView = [UIAlertView alloc] ...
于 2013-04-16T12:23:52.363 回答
1
if (!error) {
    // Handle error (?).
}

switch ([error code]) {
    case kPFErrorObjectNotFound:
        // Handle error.
        break;
    case kPFErrorConnectionFailed:
        // Handle error.
        break;
    default:
        // Handle error.
}

这仅在返回的值-code可用于switch测试表达式时才有效。AFAIK,int受支持——我不知道其他类型。

于 2013-04-16T12:47:54.830 回答