0

我正在使用 GCD 调度队列在实例化视图控制器时生成一些报告 - 报告用户将能够共享 - 所以我有一个带有 UIActionSheet 的操作按钮。

我的问题是:因为当 ViewController 加载时我在调度队列上生成报告 -我如何从调度队列向操作按钮方法(其他方法)发送通知 - 是否已完成 - 如果用户决定按下ViewController 加载后的按钮

现在,我在主线程上使用了一个 BOOLEAN 标志,当调度队列完成时它会自行切换,并且我在操作按钮上设置了一个条件,如果队列尚未完成,则禁用该按钮。但这不行……因为它可以让用户相信这是错误的。

我想让用户按下操作按钮,显示操作表,让用户按下他/她选择的共享操作,如果队列还没有完成,等到队列完成而不阻塞 UI 然后显示以 MailComposer 为例。

PS 我已经在上面提到的带有 BOOL 标志的操作按钮方法中尝试了一个 while 循环,但是 UI 会阻塞并永远保持该状态。

这是在 viewDidLoad 上生成报告的代码:

    dispatch_queue_t emailqueue;

    emailqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);

    dispatch_async(emailqueue, ^{
        [reportGenerator generate_Email_Report];
        [reportGenerator generate_PDF_Report];
        dispatch_async(dispatch_get_main_queue(), ^{done = YES;});});

    dispatch_release(emailqueue);

这就是我在操作按钮上使用的:

    if (done == YES)
    {
    if (version >= 6.0)
    {
        //UIActivityViewController *shareController = [[UIActivityViewController alloc] initWithActivityItems:@[ profileName.text,profileImage] applicationActivities:nil];
        //[self presentViewController:shareController animated:YES completion:nil];
    }

    else
    {
        UIActionSheet *selectSource = [[UIActionSheet alloc]
                                       initWithTitle:nil
                                       delegate:self
                                       cancelButtonTitle:@"Cancel"
                                       destructiveButtonTitle:nil
                                       otherButtonTitles:@"Send Report To Mail",
                                       @"Send Report PDF To Mail", nil];
        selectSource.delegate = self;
        [selectSource showInView:self.view];
        selectSource.actionSheetStyle = UIActionSheetStyleBlackTranslucent;
    }
    }
4

1 回答 1

1

我会使用 NSNotification。您可以添加您喜欢的任何类作为该通知的观察者,并修改您喜欢的任何行为以响应它。只需确保将其发布在主线程上即可。因此,如果您的处理在后台运行,那么每当它完成时,将您的通知发布到主队列以让用户执行您想要的操作。

刚看到你的编辑。如果您不想禁用该按钮,您可以使用 UIActivityIndi​​catorView 显示您的下一个 VC,当您收到通知时,移除微调器,加载视图并让用户执行任何操作。

   [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(handleThisNotification:)
    name:WhateverYouDecideToNameYourNotification
object:nil];

    -(void)handleThisNotification {
        //load your view controller and remove the spinner
    }
于 2012-10-10T08:29:33.147 回答