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 に答える