2013-08-16 4 views
0

나는 아이폰 앱을 개발하고 있는데, 객관적으로는 비교적 새로운 앱이다. 그래서 어떤 사람들은 단서를 줄 수 있기를 바란다.여러 작업을 동시에 안전하게 실행하는 방법은 무엇입니까?

내가하고있는 일은 청크로 파일을 읽고 base64로 chuncks를 인코딩하고 모든 것이 잘 작동한다는 것이다. 문제는이 줄에있다. NSString * str = [data base64EncodedString]; 그것은 256KB의 덩어리를 인코딩하기 때문에 시간이 좀 걸립니다. 한 파일에 아무런 문제가 없습니다. 문제는 이미지 파일을 인코딩한다는 것입니다. 그래서 이미지 당 10 개의 이미지를 인코딩한다고 상상해보십시오. 천천히.

이것은 다음 프로세스입니다.
* 파일을 가져옵니다.
* 파일 256KB의 chunck을 읽습니다.
* chunck를 base64로 인코딩하십시오.
* 인코딩 된 청크를 저장하고 파일에서 읽을 바이트가 더 이상 없을 때까지 반복합니다.

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
[library assetForURL:referenceURL resultBlock:^(ALAsset *asset) 
{ 

    NSUInteger chunkSize =262144; 
    uint8_t *buffer = calloc(chunkSize, sizeof(*buffer)); 
    ALAssetRepresentation *rep = [asset defaultRepresentation]; 
    NSUInteger length = [rep size]; 

    self.requestsToServer=[[NSMutableArray alloc]init]; 
    NSUInteger offset = 0; 
    do { 
     NSUInteger bytesCopied = [rep getBytes:buffer fromOffset:offset length:chunkSize error:nil]; 
     offset += bytesCopied; 

     NSData *data = [[NSData alloc] initWithBytes:buffer length:bytesCopied]; 

     NSString *str = [data base64EncodedString]; 

     //After this I add the str in a NSMutableURLRequest and I store the request 
      //in a NSMutableArray for later use. 

     } while (offset < length); 
    free(buffer); 
    buffer = NULL; 
} 
     failureBlock:^(NSError *error) 
{ 

}]; 

은 내가, 병렬의 chuncks을 인코딩 할 수 있도록 다른 스레드를 시작하고 알고 싶은 경우 공정 마무리, 나는 동시에 다른 3 ~ 4 덩어리를 encodign 할 수있는 하나 chunck를 인코딩하는 동안이 방법.

어떻게 안전하게 구현할 수 있습니까? 아니면 좋은 생각입니까?

감사합니다.

답변

1

NSOperation 및 NSOperationQueue를 확인하십시오.

http://developer.apple.com/library/ios/DOCUMENTATION/Cocoa/Reference/NSOperationQueue_class/Reference/Reference.html

간단히 덩어리 당 하나의 NSOperation을 만들고 그들에게 인코딩을 대기열 할 필요가 청크를 전달합니다.

동시에 실행할 수있는 작업 수를 대기열에 알릴 수 있습니다.

+0

GCD에서 모든 것이 이미 실행되고 있다면 NSOperation과 NSOperationQueue를 적용해야합니까? – Moy

+0

NSOperationQueue는 GCD를 사용하여 구현됩니다. GCD가 출판 된 이래로 GCD를 둘러싼 높은 수준의 래퍼입니다. 데이터를 처리하는 유체 UI를 가지려면 다른 스레드에 부하를 분산시켜야합니다. 당신은 GCD를 사용하여 그것을 할 수 있지만 NSOperationQueue가 지원하지 않는 것을 원하지 않는 한 두통이 더 많습니다. – boulette

0

iOS 용 작업 청크 작업을 병렬로 수행 할 수있는 좋은 옵션이 많이 있습니다.

Apple의 Concurrency Programming Guide을 참조하십시오.

관련 문제