나는 아이폰 앱을 개발하고 있는데, 객관적으로는 비교적 새로운 앱이다. 그래서 어떤 사람들은 단서를 줄 수 있기를 바란다.여러 작업을 동시에 안전하게 실행하는 방법은 무엇입니까?
내가하고있는 일은 청크로 파일을 읽고 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를 인코딩하는 동안이 방법.
어떻게 안전하게 구현할 수 있습니까? 아니면 좋은 생각입니까?
감사합니다.
GCD에서 모든 것이 이미 실행되고 있다면 NSOperation과 NSOperationQueue를 적용해야합니까? – Moy
NSOperationQueue는 GCD를 사용하여 구현됩니다. GCD가 출판 된 이래로 GCD를 둘러싼 높은 수준의 래퍼입니다. 데이터를 처리하는 유체 UI를 가지려면 다른 스레드에 부하를 분산시켜야합니다. 당신은 GCD를 사용하여 그것을 할 수 있지만 NSOperationQueue가 지원하지 않는 것을 원하지 않는 한 두통이 더 많습니다. – boulette