【问题标题】:Dealing with multiple BOOL combinations处理多个 BOOL 组合
【发布时间】:2012-12-08 23:56:05
【问题描述】:

以下是场景:在我的应用程序中,我正在同步一些数据,每当同步时出现错误时,我都会在BOOL 中对此进行标记。当所有同步完成后,我想为用户显示同步反馈(错误)。

如果存在日历同步错误联系人同步错误,我首先显示一个UIAlertView,其中包含有关日历同步错误的信息,当用户点击“确定”时,我会显示一个UIAlertView 包含有关联系人同步错误的信息。为了能够知道用户何时点击了“确定”,我使用了完成块。所以我的代码看起来像这样:

if (calendarSyncFailed && contactSyncFailed && facebookSyncFailed && contactSyncConflicts) {

    [self displayCalendarSyncAlertCompletionBlock:^{ 

        [self displayContactsSyncAlertCompletionBlock:^{

            [self displayFacebookSyncAlertCompletionBlock:^{

                [self displayContactSyncConflictsAlertCompletionBlock:^{

                }];
            }];
        }];
    }];

} else if (calendarSyncFailed && contactSyncFailed && facebookSyncFailed) {

    [self displayCalendarSyncAlertCompletionBlock:^{ 

        [self displayContactsSyncAlertCompletionBlock:^{

            [self displayFacebookSyncAlertCompletionBlock:^{

            }];
        }];
    }];

} else if (contactSyncFailed && facebookSyncFailed && contactSyncConflicts) {

    [self displayContactsSyncAlertCompletionBlock:^{

        [self displayFacebookSyncAlertCompletionBlock:^{

            [self displayContactSyncConflictsAlertCompletionBlock:^{

            }];
        }];
    }];

} else if (you get the idea…) {

}

正如您所见,处理这 4 个布尔值会有很多不同的组合,我想知道是否有更智能/优雅的编码方式?

【问题讨论】:

  • 用无数的警报来窃听用户并不是一种愉快的体验。我会选择发送一条消息,将所有问题按最重要的第一个排序,或者只显示一个包含最重要错误的警报并保留其他错误。
  • 感谢您的意见,但这个问题与 UI 无关。不幸的是,所有错误对用户来说都同样重要,所以我不能“备用”任何错误。无论如何,这是一种罕见的情况,实际上一次会出现 4 个错误。
  • 仍然相信您应该寻求单一的错误消息解决方案。无论如何,您可以设置第二组布尔值,例如contactSyncFailedErrorNeedToShow。在错误时,您设置的不是一个而是两个,并使用第二个来简化您的逻辑,并且只有一个代码块来处理所有未显示的错误。
  • 按照 vaderkvarn 的建议等待 didDismissWithButtonIndex 是一个很好的解决方案。但是我同意其他 cmets,这是一个糟糕的用户体验。

标签: objective-c cocoa-touch boolean combinations boolean-logic


【解决方案1】:

虽然我同意 demosten 的观点,即只有一条消息会更好,但这就是我会用更少的代码做到这一点的方法:

  1. 使用可变数组作为存储警报视图的属性。

  2. 在您测试条件的方法中,为每个评估结果为真的故障创建一个警报视图,并按所需顺序将它们放入您的数组中。 (这是关键部分,因为您只进行 4 次测试,而不是 2^4 - 1 次测试)。

  3. 像这样实现UIAlertViewDelegate方法alertView: didDismissWithButtonIndex:


-(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    NSInteger nextIndex = [self.alertViews indexOfObject:alertView] + 1;
    if (nextIndex < [self.alertViews count]){
    UIAlertView *next = [self.alertViews objectAtIndex: nextIndex];
        [next show];
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-07
    • 2015-02-04
    • 1970-01-01
    • 2019-11-18
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多