0

我正在运行两种异步方法(请参阅此SO 线程以供参考)。

除非我有这种情况,否则它工作得很好。当任一方法发生错误时,我将为用户显示此信息,因此在块中我将检查错误并执行以下操作:

if(error) {
    int64_t delayInSeconds = 2.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), {

    // Show a popup for 2.0 seconds alerting the user of the error
    });
}

这没有问题。但是当这两个异步操作都有错误时,就会出现问题。完成的第一个方法将显示错误可能仅 0.5 秒,然后第二个异步操作将显示错误 2.0 秒(不考虑已经显示错误消息)。

所以我需要一些过程来检查是否已经显示了错误消息,然后等待该错误消息消失(2.0 秒),然后立即显示第二条错误消息。

4

2 回答 2

2

听起来您只需要实现一个队列即可向用户显示这些错误。您可以将其作为 上的一个类别SSHUDView,使用如下简单的界面:

@interface SSHUDView (queue)
- (void)showForDuration:(NSTimeInterval)duration;
@end

使用串行 GCD 队列实现它:

@implementation SSHUDView (queue)

- (void)showForDuration:(NSTimeInterval)duration {
    static dispatch_once_t once;
    static dispatch_queue_t queue;
    dispatch_once(&once, ^{
         queue = dispatch_queue_create("SSHUDView(serial)", 0);
    });

    dispatch_async(queue, ^{
        dispatch_sync(dispatch_get_main_queue(), ^{
            [self show];
        });

        usleep(duration * USEC_PER_SEC);

        dispatch_sync(dispatch_get_main_queue(), ^{
            [self dismiss];
        });
    });
}

@end
于 2012-12-01T19:19:48.500 回答
1

作为 Rob Mayoff 的好答案的替代方案,您可能想要重构您的 UI。对于您和最终用户来说,一个接一个地弹出对话框可能有点乏味。事实上,弹出对话框可能很乏味,特别是如果它们是模态的(即使只是表单)。

也许你可以做一些更有趣的事情?就像将错误显示为从窗口顶部向下滑动的横幅一样。如果您有多个错误,则只有多个横幅,一个在另一个下方。然后它们会在适当的时间淡出(尽管要小心自动关闭,因为用户可能不会一直在观看您的应用程序)。

另一种方法是创建一个对话框,但在发生其他错误时更改或附加到其消息中。这样做的缺点是对话框在用户阅读时可能会发生变化,因此您必须小心并仔细考虑这是否合适。它在错误密切相关的情况下非常有用,例如,您尝试连接到您的服务器,但它失败了。因此,您在开始常规网络连接测试的同时显示错误消息。当该测试返回并说网络完全消失时,您更新您的对话框以澄清不是服务器关闭,而是您的互联网连接。

或者,如果您将这些更多显示为与音量变化指示器相同的叠加层,您可能只想并排显示它们。您甚至可以很花哨,让现有的(S)滑动到左侧为新的腾出空间,但除非它们是非常简单的图标,否则可能会使用户难以理解正在发生的事情。

于 2012-12-01T20:30:19.257 回答