GCD Dispatch - 在调用其他方法时发送通知

时间:2012-10-10 08:24:16

标签: objective-c ios grand-central-dispatch

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

我的问题是:因为我在ViewController加载时生成调度队列的报告 - 如何从调度队列发送通知到操作按钮方法(其他方法) - 已完成或未完成 - 如果一旦ViewController加载

,用户就决定按下该按钮

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

我想让用户按下操作按钮,显示操作表,让用户按下他/她选择的共享操作,如果队列尚未完成,请等待队列完成而不阻止UI然后以MailComposer为例进行说明。

P.S。我已经尝试使用上面提到的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);

这就是我在Action Button上使用的内容:

    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;
    }
    }

1 个答案:

答案 0 :(得分: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
    }