AWS S3 SDK v2 for iOS-将映像文件下载到UIImage

AWS S3 SDK v2 for iOS-将映像文件下载到UIImage,ios,amazon-web-services,amazon-s3,Ios,Amazon Web Services,Amazon S3,似乎这应该是相对简单的。我正在使用用于iOS的AWS SDK(v2),我正在尝试下载一个.png文件,并以UIImage的形式将其显示在屏幕上。一切都很好!只是很奇怪 这是我的密码: AWSStaticCredentialsProvider *credentialsProvider = [AWSStaticCredentialsProvider credentialsWithAccessKey:@"MY_ACCESS_KEY" secretKey:@"MY_SECRET_KEY"];

似乎这应该是相对简单的。我正在使用用于iOS的AWS SDK(v2),我正在尝试下载一个.png文件,并以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,没有任务错误,因此将记录get image。这种情况发生得相当快。然而,直到大约10秒后,UIImageView才会在屏幕上更新。我甚至运行了调试器,以查看
NSLog(@“Got image”)后面是否有任何行线路花了很长时间,但他们没有。它们都执行得非常快,但是UIImageView不会在UI上更新。

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

  • 在块中使用Grand Central Dispatch并在主线程上运行它:

    ...
    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;
    });
    ...
    
    [[transferManager getObject:getImageRequest] continueWithExecutor:[BFExecutor mainThreadExecutor]
                                                            withBlock:^id(BFTask *task) {
    ...
    
  • 使用
    mainThreadExecutor
    在主线程上运行块:

    ...
    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;
    });
    ...
    
    [[transferManager getObject:getImageRequest] continueWithExecutor:[BFExecutor mainThreadExecutor]
                                                            withBlock:^id(BFTask *task) {
    ...
    

  • 希望这有帮助,

    谢谢,效果很好;)听到你正在苦苦挣扎的库的创建者的声音总是很好。顺便说一句,现在我注意到下载一个小图像实际上需要几秒钟,但我认为如果我利用CloudFront[task.result body]是NSURL的一个实例,而不是NSData,这将得到解决。在aws-ios-sdk-2.1.2上测试