如何使用UIPasteboard为动画.gif异步加载图像URL

时间:2013-10-18 18:22:57

标签: ios objective-c iphone-5

我的视图中有一个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消息。如何为用户提供更好的体验?

2 个答案:

答案 0 :(得分:1)

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

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

  • MessageUI.framework
  • MobileCoreServices.framework

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

#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参数可以是MessageComposeResultCancelledMessageComposeResultSentMessageComposeResultFailed,具体取决于用户的操作。

答案 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不会更新。