2014-07-23 2 views
3

비교적 간단 해 보입니다. iOS 용 AWS SDK (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

BTW 이제 작은 이미지를 다운로드하는 데 실제로 몇 초가 걸리지 만 CloudFront를 활용하면 해결 될 것입니다. –

+0

[task.result body]는 NSData가 아닌 NSURL의 인스턴스입니다. aws-ios-sdk-2.1.2에서 테스트 – Javan