ビューコントローラーがインスタンス化されたときに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;
}
}