Диспетчеризация очередей и асинхронный RNCryptor
Это продолжение кАсинхронно расшифровывает большой файл с помощью RNCryptor на iOS
Мне удалось асинхронно дешифровать большой загруженный файл (60 МБ) с помощью метода, описанного в этом посте, исправленного Калманом в его ответе.
В основном это выглядит так:
int blockSize = 32 * 1024;
NSInputStream *cryptedStream = [NSInputStream inputStreamWithFileAtPath:...];
NSOutputStream *decryptedStream = [NSOutputStream output...];
[cryptedStream open];
[decryptedStream open];
RNDecryptor *decryptor = [[RNDecryptor alloc] initWithPassword:@"blah" handler:^(RNCryptor *cryptor, NSData *data) {
NSLog("Decryptor recevied %d bytes", data.length);
[decryptedStream write:data.bytes maxLength:data.length];
if (cryptor.isFinished) {
[decryptedStream close];
// call my delegate that I'm finished with decrypting
}
}];
while (cryptedStream.hasBytesAvailable) {
uint8_t buf[blockSize];
NSUInteger bytesRead = [cryptedStream read:buf maxLength:blockSize];
NSData *data = [NSData dataWithBytes:buf length:bytesRead];
[decryptor addData:data];
NSLog("Sent %d bytes to decryptor", bytesRead);
}
[cryptedStream close];
[decryptor finish];
Тем не менее, я все еще сталкиваюсь с проблемой: все данные загружаются в память перед расшифровкой. Я вижу группу «Отправлено X байтов в расшифровщик», и после этого та же самая группа «Декриптор получил Х байтов» в консоли, когда я хочу видеть «Отправлено, получено, отправлено, получено, .. . ".
Это хорошо для небольших (2 МБ) файлов или для больших (60 МБ) файлов на симуляторе; но на реальном iPad1 происходит сбой из-за ограничений памяти, поэтому, очевидно, я не могу сохранить эту процедуру для моего производственного приложения.
Я чувствую, что мне нужно отправить данные в расшифровщик с помощьюdispatch_async
вместо того, чтобы слепо отправить его вwhile
петля, однако я полностью потерян. Я пробовал:
while
и используяdispatch_async(myQueue, ^{ [decryptor addData:data]; });
то же самое, но отправка всего кода внутриwhile
петлято же самое, но отправка целогоwhile
петляс помощьюRNCryptor
-при условииresponseQueue
вместо моей собственной очередиНичего не работает среди этих 4 вариантов.
У меня пока нет полного понимания очередей отправки; Я чувствую, что проблема заключается здесь. Я был бы рад, если бы кто-то мог пролить свет на это.