Colas de despacho y RNCryptor asíncrono

Este es un seguimiento deDescifrar asincrónicamente un archivo grande con RNCryptor en iOS

Logré descifrar de forma asíncrona un gran archivo descargado (60 Mb) con el método descrito en esta publicación, corregido por Calman en su respuesta.

Básicamente va así:

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

Sin embargo, todavía estoy enfrentando un problema: todos los datos se cargan en la memoria antes de ser descifrados. Puedo ver un montón de "Enviado X bytes a descifrador", y después de eso, el mismo conjunto de "Descifrado descifrado X bytes" en la consola, cuando me gustaría ver "Enviado, recibido, enviado, recibe, ... . ".

Eso está bien para archivos pequeños (2Mb), o con archivos grandes (60Mb) en el simulador; pero en un iPad1 real se bloquea debido a limitaciones de memoria, así que obviamente no puedo mantener este procedimiento para mi aplicación de producción.

Siento que necesito enviar los datos al descifrador usandodispatch_async en lugar de enviarlo ciegamente en elwhile Bucle, sin embargo estoy completamente perdido. He intentado:

creando mi propia cola antes de lawhile, y usandodispatch_async(myQueue, ^{ [decryptor addData:data]; });Lo mismo, pero despachando todo el código dentro de lawhile lazoLo mismo, pero despachando todo.while lazoutilizandoRNCryptor-previstoresponseQueue en lugar de mi propia cola

Nada funciona entre estas 4 variantes.

Todavía no tengo una comprensión completa de las colas de envío; Siento que el problema radica aquí. Me alegraría si alguien pudiera arrojar algo de luz sobre esto.

Respuestas a la pregunta(3)

Su respuesta a la pregunta