Filas de despacho e RNCryptor assíncrono

Este é um follow-up paraDescriptografar assincronamente um arquivo grande com o RNCryptor no iOS

Eu consegui decifrar de forma assíncrona um grande arquivo baixado (60Mb) com o método descrito neste post, corrigido por Calman em sua resposta.

Basicamente é assim:

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];

No entanto, ainda estou enfrentando um problema: todos os dados são carregados na memória antes de serem descriptografados. Eu posso ver um monte de "Enviados X bytes para decryptor", e depois disso, o mesmo bando de "Decryptor recevied X bytes" no console, quando eu gostaria de ver "Enviado, recebido, enviado, recebe, .. ".

Isso é bom para arquivos pequenos (2Mb) ou com arquivos grandes (60Mb) no simulador; mas em um iPad1 real ele falha devido a restrições de memória, então obviamente não posso manter este procedimento para o meu aplicativo de produção.

Eu sinto que preciso enviar os dados para o decodificador usandodispatch_async em vez de enviá-lo cegamente nowhile loop, no entanto estou completamente perdido. Eu tentei:

criando minha própria fila antes dowhilee usandodispatch_async(myQueue, ^{ [decryptor addData:data]; });o mesmo, mas despachando todo o código dentro dowhile laçoo mesmo, mas despachando o todowhile laçousandoRNCryptor-forneceuresponseQueue em vez da minha própria fila

Nada funciona entre essas 4 variantes.

Ainda não tenho uma compreensão completa das filas de despacho; Eu sinto que o problema está aqui. Eu ficaria feliz se alguém pudesse lançar alguma luz sobre isso.

questionAnswers(3)

yourAnswerToTheQuestion