Диспетчеризация очередей и асинхронный RNCryptor

Это продолжение кАсинхронно расшифровывает большой файл с помощью RNCryptor на iOSI '

Нам удалось асинхронно дешифровать большой загруженный файл (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 байт в расшифровщик "и после этого та же кучкаРасшифровщик получил X байтов в консоли, когда яхотелось бы увидетьОтправлено, получено, отправлено, получено, ... ".

Тот'отлично подходит для небольших (2 МБ) файлов или для больших (60 МБ) файлов на симуляторе; но на реальном iPad1 он падает из-за ограничений памяти, так что, очевидно, я могусохрани эту процедуру для моего производственного приложения.

Я чувствую, что мне нужно отправить данные в расшифровщик с помощьюdispatch_async вместо того, чтобы слепо отправить его вwhile петля, однако яЯ полностью потерян. Я'мы пробовали:

создавая свою очередь передwhileи используяdispatch_async(myQueue, ^{ [decryptor addData:data]; });то же самое, но отправка всего кода внутриwhile петлято же самое, но отправка целогоwhile петляс помощьюRNCryptor-предоставленаresponseQueue вместо моей собственной очереди

Ничего не работает среди этих 4 вариантов.

Я непока еще не имеет полного понимания очередей отправки; Я чувствую, что проблема заключается здесь. Я'Буду рад, если кто-нибудь сможет пролить свет на это.

Ответы на вопрос(3)

Ваш ответ на вопрос