2012-02-06 5 views
1

URL에서 iPhone 파일 시스템으로 약 1000 개의 이미지를 다운로드했지만 비동기 적으로하고 싶습니다. 현재이 코드를 사용하고 있습니다 :비동기식으로 1000 개의 이미지를 다운로드하는 방법은 무엇입니까?

-(void)saveImageInFile:(NSString *)imageName image:(UIImage *)img{ 

    // add the images in the file 
    NSData *tmpData; 

    if ([self.constImageType isEqualToString:@"png"]) { 
     tmpData = UIImagePNGRepresentation (img); 
    } 

    else if ([self.constImageType isEqualToString:@"jpg"]) { 
     tmpData = UIImageJPEGRepresentation(img, 0.7f); 
    } 

    NSString *path = [self.documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName,self.constImageType]]; 
    //NSLog(path); 
    [tmpData writeToFile:path atomically:YES]; 

} 

답변

1

내가 핵심 데이터의 URL의 이미지에 저장 한 후 모든 레코드의 NSArray을 얻고 1000보다 훨씬 더 많은 이미지와 비슷한 일을하고있는 중이 야 : 여기

짧은 예이다 여기서 레코드 속성은 imageDownloaded = NO입니다. 이미지를 다운로드하는 동안 해당 레코드의 imageDownloaded = YES을 설정 했으므로 앱을 다시 시작해야하는 경우 중단 된 부분부터 다시 시작할 수 있습니다.

다음은 무슨 일이 일어나는가의 작은 예입니다. 그랜드 센트럴 디스패치를 ​​사용하여이 프로세스를 배경으로하므로 메인 스레드를 차단하지 않습니다. 그랜드 센트럴 파견 https://developer.apple.com/library/mac/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

+0

내 쿼리는 NSMutableArray에서 약 1000 개의 URL을 가지고 있습니다 .. 어디에서 모든 링크를 배치 할 수 있는지 말해 줄 수 있고 .. 전체 기능을 제공 할 수 있습니다. 매우 이해하기 힘듭니다. 그게 사실이지만 나는 당신의 일을 아주 좋은 일에 감사하고 감사한다. –

+0

모바일 오버로드 나는 애플 고등 법원과 공공 도서관을 나가지 않기 때문에 답장을 보내 주시면 감사하겠습니다. 덕분에 –

+1

나는 몇 시간 만에 좀 더 광범위한 예를 생각해 낼 수 있습니다. 나는이 저녁 늦게보다 완전한 기능으로 돌아올 것이다. – MobileOverlord

0

Grand Central Dispatch (GCD)을 읽으십시오.

기본값 대기열 중 하나를 가져 와서 블록을 사용하여 해당 대기열에 코드를 저장하십시오. 블록에 익숙하지 않은 경우 Blocks Programming Topic을 읽으십시오.

dispatch_queue_t queue = dispatch_get_global_queue(0, 0); 

dispatch_async(queue, ^{ 
// This is a BLOCK. Put code here to download images in background... 
} 
1

__block NSArray *records; //...get records 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentsDirectory = [paths objectAtIndex:0]; 

     for (NSManagedObject *obj in records) { 
      NSString *imageName = [obj valueForKey:@"filename"]; 

      NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",[obj valueForKey:@"remote_path"],imageName]]; 
      NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
      NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:NULL error:NULL]; 
      [responseData writeToFile:[NSString stringWithFormat:@"%@/%@",documentsDirectory,imageName] atomically:NO]; 
      [obj setValue:[NSNumber numberWithBool:YES] forKey:@"imageDownloaded"]; 
     } 
    }); 

자세한 정보는 당신이 https://github.com/ZarraStudios/ZDS_Shared를 다운로드하고

// queue download 
[[ZSAssetManager singleton] queueAssetForRetrievalFromURL:url]; 

// recover the download from the file system 
UIImage *imagen = [[ZSAssetManager singleton] imageForURL:url]; 

왜이 라이브러리를 사용합니까 제안?

  • 사용 가능한 대역폭 및 네트워크 상태에 따라 다운로드를 조절/일시 중지/다시 시작합니다. NSOperationQueue는 블록과 달리 일시 중단 될 수 있습니다.
  • 충돌을 피하기 위해 URL 해시에서 파일 이름을 생성합니다.
  • 응용 프로그램 시작시 이미 캐시 된 파일 목록을 메모리로 읽습니다.
  • 선택적으로 응용 프로그램이 백그라운드로 이동할 때 캐싱을 허용합니다.
  • 파일의 만료 날짜를 설정하거나 만료일을 설정할 수 없습니다.
  • 캐시에서 UIImages를 너무 빨리 읽으므로 응용 프로그램에 메모리 경고가 표시되면 메모리 캐시가 플러시됩니다.
  • 사용하기 쉽습니다 (위의 2 줄만).

독자적인 솔루션을 롤업하려면 이미 모든 것을 구현했기 때문에 해당 라이브러리의 소스 코드를 읽는 데 도움이 될 수 있습니다.

관련 문제