我的视图中有一个UIButton,当按下该按钮时,这是代码
- (IBAction)sendSMS:(UIButton *)sender
{
NSData *gifImage = [[NSData alloc] initWithContentsOfURL:url];
UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard];
pasteBoard.persistent = YES;
//pasteBoard.image = self.messageViewImage;
[pasteBoard setData:gifImage forPasteboardType:@"com.compuserve.gif"];
NSString *phoneToCall = @"sms:";
NSString *phoneToCallEncoded = [phoneToCall stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
NSURL *url = [[NSURL alloc] initWithString:phoneToCallEncoded];
[[UIApplication sharedApplication] openURL:url];
}
我正在尝试复制要粘贴在mms消息中的动画gif。如何异步完成此任务?当我按下按钮时大约需要3秒钟,按钮有蓝色背景,然后弹出mms消息。如何为用户提供更好的体验?
答案 0 :(得分:1)
实现目标的一种方法是使用MessageUI
框架显示添加了GIF作为附件的MFMessageComposeViewController
。使用这种方法,您永远不必将用户切换到消息应用程序 - 这一切都在您自己的应用程序内完成。这是你如何做到的。
第一步是将以下框架添加到您的项目中:
在视图控制器中,添加以下导入:
#import <MessageUI/MessageUI.h>
#import <MobileCoreServices/UTCoreTypes.h>
接下来,定义MFMessageComposeViewController
的属性:
@property (nonatomic, strong) MFMessageComposeViewController *messageController;
我们正在定义一个属性,以便我们可以处理稍后在MMS视图中点击Cancel
的用户。
在视图控制器的viewDidLoad
中,添加以下内容:
self.messageController = [[MFMessageComposeViewController alloc] init];
self.messageController.messageComposeDelegate = self;
您希望sendSMS
方法看起来像这样:
- (IBAction)sendSMS:(UIButton *)sender
{
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
NSData *gifData = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
if ([MFMessageComposeViewController canSendText]) {
[self.messageController addAttachmentData:gifData typeIdentifier:(__bridge NSString *)kUTTypeGIF filename:@"animated.gif"];
dispatch_async(dispatch_get_main_queue(), ^{
[self presentViewController: self.messageController animated:YES completion:NULL];
});
}
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
});
}
在此方法中,GIF将在后台下载并分配给gifData
。然后将gifData
添加为消息编辑器视图的附件,并向用户显示编辑器视图。
当用户发送彩信或点击Cancel
按钮时,会调用messageComposeViewController:didFinishWithResult:
。在该方法中,您需要关闭消息编写器模式视图:
- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result
{
[self.smsComposer dismissViewControllerAnimated:YES completion:NULL];
}
result
参数可以是MessageComposeResultCancelled
,MessageComposeResultSent
或MessageComposeResultFailed
,具体取决于用户的操作。
答案 1 :(得分:0)
我不知道它是否有用,因为加载图像所需的时间不会因为你是异步而缩短。但这是你如何做到异步。
dispatch_queue_t que = dispatch_queue_create("myque", DISPATCH_QUEUE_SERIAL);
dispatch_async(que, ^{
NSData *gifImage = [[NSData alloc] initWithContentsOfURL:url];
dispatch_async(dispatch_get_main_queue(), ^{
UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard];
pasteBoard.persistent = YES;
//pasteBoard.image = self.messageViewImage;
[pasteBoard setData:gifImage forPasteboardType:@"com.compuserve.gif"];
});
});
NSString *phoneToCall = @"sms:";
NSString *phoneToCallEncoded = [phoneToCall stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
NSURL *url = [[NSURL alloc] initWithString:phoneToCallEncoded];
[[UIApplication sharedApplication] openURL:url];
这里重要的是你记得做所有更新主阙GUI的代码,否则GUI不会更新。