【问题标题】:Update user with process progress from singleton使用单例的进程进度更新用户
【发布时间】:2014-07-17 17:23:06
【问题描述】:

我在单例/共享实例中获得了以下方法,并希望向用户更新获取电子邮件的进度。

- (void)getAllImapEmailsForMailbox:(NSString *)mailbox completionBlock:(void (^)(BOOL success, NSString *errorString, NSArray *emails))block

首先我使用密钥解锁 API,然后连接到他们的 IMAP 服务器,然后使用他们的详细信息登录,然后选择特定邮箱,然后循环整个邮箱以下载消息。

所以我想知道如何将这些更新从单例方法获取到我的视图控制器,例如在 UIAlertView 中显示这些消息。

例如。正在连接.. 正在登录.. 正在选择邮箱.. 正在下载邮件 1 of 69..

我目前只发送 1 条消息说正在下载电子邮件,但它花费的时间太长,并且不希望用户认为应用程序挂起并且没有执行任何操作。这就是我正在做的:

UIAlertView *loadingView = [[UIAlertView alloc] initWithTitle:@"Downloading Emails..." message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:nil];
[loadingView show];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
    [self getAllEmailsForMailbox:@"Inbox"];
    dispatch_async(dispatch_get_main_queue(), ^{
        [loadingView dismissWithClickedButtonIndex:-1 animated:YES];
    });
});

谢谢!

【问题讨论】:

  • 仅供参考 - 您可能希望考虑使用 github.com/jdg/MBProgressHUD 而不是警报视图。
  • 是的,我真的不在乎我使用什么,只是想知道如何将它从单例中拉到我当前的视图控制器中?
  • 只需在代码中的不同时间发布不同的消息。如果您打算使用警报视图,则需要关闭旧视图并每次显示一个新视图。
  • 我可以通过 NSLog “发布”它们没问题,但我不能使用 UIAlertView 或单例中的其他任何东西?
  • 当然可以。你为什么不认为你可以?

标签: ios objective-c singleton instance objective-c-blocks


【解决方案1】:

添加另一个块参数,称为 statusBlock。给块一个包含状态消息的字符串参数。您如何获得发送此块的状态取决于您如何执行所列步骤的详细信息,但在大纲级别...

- (void)getAllImapEmailsForMailbox:(NSString *)mailbox
      statusBlock:(void (^)(NSString *)statusBlock
      completionBlock:(void (^)(BOOL success, NSString *errorString, NSArray *emails))block {

    statusBlock(@"connecting");
    // do connecting stuff

    NSInteger numberOfMessagesToFetch = // find this out however you do now

    statusBlock([NSString stringWithFormat:@"fetching %d messages", numberOfMessagesToFetch]);

    // fetch mail, and so on

在调用方:

[mailSingleton getAllImapEmailsForMailbox:@"mailbox"
    statusBlock:^(NSString *message) { // update UI with message }
    completionBlock: ... { // update UI now that you're complete }];

另外,查看您的编辑,是否可以在此方法中隐藏异步内容?对于调用者来说会更友好,因为调用者可以传递块并假设异步。

【讨论】:

  • 这行得通,我以为它会阻止阻塞,谢谢,将来会使用;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
相关资源
最近更新 更多