【发布时间】:2013-01-23 14:04:22
【问题描述】:
这是Asynchronously decrypt a large file with RNCryptor on iOS的后续行动
我已经设法使用本文中描述的方法异步解密一个下载的大型文件 (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 种变体都不起作用。
我还没有完全理解调度队列;我觉得问题出在这里。如果有人能对此有所了解,我会很高兴。
【问题讨论】:
标签: ios objective-c grand-central-dispatch rncryptor