0

我的视图上有一个 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];
}

我正在尝试复制要粘贴到彩信中的动画 gif。我怎样才能异步完成这个任务?当前,当我按下按钮时,大约需要 3 秒钟,并且按钮具有蓝色背景,然后弹出 mms 消息。我怎样才能为用户提供更好的体验?

4

2 回答 2

1

实现目标的一种方法是使用MessageUI框架来显示MFMessageComposeViewControllerGIF,并将 GIF 作为附件添加。使用这种方法,您永远不必将用户切换到 Messages 应用程序——这一切都在您自己的应用程序中完成。这是你如何做到的。

第一步是将以下框架添加到您的项目中:

  • MessageUI.framework
  • MobileCoreServices.framework

在您的视图控制器中,添加以下导入:

#import <MessageUI/MessageUI.h>
#import <MobileCoreServices/UTCoreTypes.h>

接下来,为 定义属性MFMessageComposeViewController

@property (nonatomic, strong) MFMessageComposeViewController *messageController;

我们正在定义一个属性,以便我们Cancel稍后可以处理用户在 MMS 视图中的点击。

在视图控制器中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];
}

参数将resultMessageComposeResultCancelledMessageComposeResultSentMessageComposeResultFailed取决于用户所做的事情。

于 2013-10-18T21:22:37.637 回答
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 将不会更新。

于 2013-10-18T20:35:30.093 回答