2014-07-23 72 views
3

似乎这应该是相对简单的。我正在使用适用于iOS的AWS开发工具包(v2),我正尝试下载.png文件并将其显示到UIImage中的屏幕上。一切真的有用!只是很奇怪......适用于iOS的AWS S3 SDK v2 - 将图像文件下载到UIImage

这里是我的代码:

AWSStaticCredentialsProvider *credentialsProvider = [AWSStaticCredentialsProvider credentialsWithAccessKey:@"MY_ACCESS_KEY" secretKey:@"MY_SECRET_KEY"]; 
    AWSServiceConfiguration *configuration = [AWSServiceConfiguration configurationWithRegion:AWSRegionUSWest1 credentialsProvider:credentialsProvider]; 
    [AWSServiceManager defaultServiceManager].defaultServiceConfiguration = configuration; 

    AWSS3 *transferManager = [[AWSS3 alloc] initWithConfiguration:configuration]; 
    AWSS3GetObjectRequest *getImageRequest = [AWSS3GetObjectRequest new]; 
    getImageRequest.bucket = @"MY_BUCKET"; 
    getImageRequest.key = @"MY_KEY"; 

    [[transferManager getObject:getImageRequest] continueWithBlock:^id(BFTask *task) { 
     if(task.error) 
     { 
      NSLog(@"Error: %@",task.error); 
     } 
     else 
     { 
      NSLog(@"Got image"); 
      NSData *data = [task.result body]; 
      UIImage *image = [UIImage imageWithData:data]; 
      myImageView.image = image; 
     } 
     return nil; 
    }]; 

当这段代码执行后,continueWithBlock得到执行,没有任务的错误,所以了图像记录。这很快发生。但是,直到大约10秒钟之后,UIImageView才会在屏幕上更新。我甚至跑过了调试器,看看NSLog(@"Got image");系列之后的任何行是否花了很长时间,但没有。它们都执行得非常快,但是UIImageView不会在UI上更新。

回答

5

问题是您正在从后台线程更新UI组件。 continueWithBlock:块在后台线程中执行,并导致上述行为。你有两个选择:

  1. 使用大中央调度中块和主线程上运行它:

    ... 
    NSURL *fileURL = [task.result body]; 
    NSData *data = // convert fileURL to data 
    dispatch_async(dispatch_get_main_queue(), ^{ 
        UIImage *image = [UIImage imageWithData:data]; 
        myImageView.image = image; 
    }); 
    ... 
    
  2. 使用mainThreadExecutor运行在主线程块:

    [[transferManager getObject:getImageRequest] continueWithExecutor:[BFExecutor mainThreadExecutor] 
                     withBlock:^id(BFTask *task) { 
    ... 
    

希望这会有所帮助,

+0

谢谢,作品像一个魅力;)总是很高兴听到你正在努力与图书馆的创造者。 –

+0

顺便提一下,我注意到它实际上需要几秒钟才能下载一个小图像,但我认为如果我利用CloudFront将会解决此问题 –

+0

[task.result body]是NSURL的一个实例,而不是NSData。在aws-ios-sdk-2.1.2上测试 – Javan

相关问题