我正在使用 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;
}
}