这是在 iOS 上使用 RNCryptor 异步解密大文件的后续内容
我已经设法使用本文中描述的方法异步解密了一个大型下载文件(60Mb),Calman 在他的回答中进行了更正。
它基本上是这样的:
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 字节”,当我想看到“发送,接收,发送,接收,.. ."。
这对于小(2Mb)文件或模拟器上的大(60Mb)文件来说很好;但是在真正的 iPad1 上,由于内存限制,它会崩溃,所以显然我不能为我的生产应用程序保留这个过程。
我觉得我需要通过使用dispatch_async
而不是在while
循环中盲目地发送数据来将数据发送到解密器,但是我完全迷路了。我试过了:
- 在 ,之前创建我自己的队列
while
并使用dispatch_async(myQueue, ^{ [decryptor addData:data]; });
while
相同,但在循环内调度整个代码- 相同,但调度整个
while
循环 - 使用
RNCryptor
-providedresponseQueue
而不是我自己的队列
这 4 个变体中没有任何作用。
我还没有完全理解调度队列;我觉得问题出在这里。如果有人能对此有所了解,我会很高兴。