【发布时间】:2013-08-07 15:54:22
【问题描述】:
我有一组 UIActivities,我将数据准备为给定格式,然后将其附加到用户可以发送的电子邮件中。我正在使用 UIActivity 的子类,我正在 -(void)activityViewController 中完成所有工作:
- (UIViewController *)activityViewController
{
[self.alert show];
NSString *filename = [NSString stringWithFormat:@"%@.gpx", self.activity.title];
__block MFMailComposeViewController *mailComposeVC = [[MFMailComposeViewController alloc] init];
mailComposeVC.mailComposeDelegate = self;
[mailComposeVC setSubject:[NSString stringWithFormat:@"GPX export for %@ activity", self.activity.title]];
[mailComposeVC setMessageBody:@"Generated with Slopes" isHTML:NO];
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
CBCFileExporter *exporter = [[CBCFileExporter alloc] init];
NSData *exportContents = [exporter exportActivity:self.activity inFileFormat:CBCFileExportTypeGPX error:nil];
[mailComposeVC addAttachmentData:exportContents mimeType:@"application/gpx+xml" fileName:filename];
});
[self.alert dismissWithClickedButtonIndex:0 animated:YES];
return mailComposeVC;
}
我遇到的具体问题是 UIAlertView 直到 dispatch_sync 完成才真正显示。我意识到 dispatch_sync 可能(?)在等待时阻塞了主线程,但问题是我需要等到附件生成后再从该方法调用返回(MFMailComposeViewController 文档说一旦视图是你就不能添加附件介绍)。
如何在主线程必须等待完成的重要任务必须运行时显示警报视图?
【问题讨论】:
-
同步请求意味着您必须等到完成...使用异步请求。
-
@TheTiger 如果我这样做,附件是在 显示邮件 VC 之后生成的,这意味着未添加附件。 (他们在显示 VC 后阻止添加附件)
-
您应该在块中添加附件,然后在完成后显示邮件编辑器
-
@TheTiger 不太确定我是否关注你。将其添加到块中会起作用,但使其异步会导致 VC 在块完成之前显示。 UIActivities 的工作方式是你必须返回 UIViewController 以从该方法显示给用户,我不能推迟显示它,直到块完成之后。
标签: iphone ios uialertview grand-central-dispatch uiactivity