我正在使用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;
}
}
答案 0 :(得分:1)
我会使用NSNotification。您可以添加您喜欢的任何类作为该通知的观察者,并修改您喜欢的任何行为以响应它。只需确保将其发布在主线程上。因此,如果您的处理在后台运行,那么无论何时完成,都要将通知发布到主队列,让用户按照您的意愿行事。
刚看到你的编辑。如果您不想禁用该按钮,您只需使用UIActivityIndicatorView显示下一个VC,并在收到通知时删除微调器,加载视图并让用户执行任何操作。
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleThisNotification:)
name:WhateverYouDecideToNameYourNotification
object:nil];
-(void)handleThisNotification {
//load your view controller and remove the spinner
}