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:
while
, 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 colaNada 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.