iOS で RNCryptor を使用して大きなファイルを非同期で復号化する必要があります (プログレス バーを表示するため)。私はどこにも例を見つけられなかったので、私が正しいと推測したことを試しましたが...私が思いついたものは機能しません:復号化のハンドラーは決して呼び出されず、スレッドはすべてのデータを送信した後に EXC_BAD_ADDRESS でクラッシュしました関数の最後に。
NSOutputStream *decryptedStream = [NSOutputStream outputStreamToFileAtPath:decryptedPath append:NO];
[decryptedStream open];
NSUInteger totalBytesToRead = [[[NSFileManager defaultManager] attributesOfItemAtPath:tempPath error:nil] fileSize];
__block NSUInteger totalBytesRead = 0;
LOG("I've got %d bytes to decrypt.", totalBytesToRead);
RNDecryptor *decryptor = [[RNDecryptor alloc] initWithPassword:SNCatalogPassword handler:^(RNCryptor *cryptor, NSData *data) {
totalBytesRead += data.length;
[decryptedStream write:data.bytes maxLength:data.length];
LOG("Decrypted %d bytes : %d / %d bytes treated", data.length, totalBytesRead, totalBytesToRead);
if (cryptor.isFinished)
{
//proceed
LOG("Done with decrypting.");
[decryptedStream close];
}
}];
// Feed data to the decryptor
NSInputStream *cryptedStream = [NSInputStream inputStreamWithFileAtPath:tempPath];
[cryptedStream open];
while (cryptedStream.hasBytesAvailable)
{
uint8_t buf[4096];
NSUInteger bytesRead = [cryptedStream read:buf maxLength:4096];
NSData *data = [NSData dataWithBytes:buf length:bytesRead];
LOG("Sending %d bytes to decryptor...", bytesRead);
dispatch_async(dispatch_get_main_queue(), ^{
[decryptor addData:data];
});
}
LOG("Sent everything.");
[decryptor finish];
[cryptedStream close];
(明らかに、tempPath
は暗号化されたファイルへのパスです。decryptedPath
は復号化されたデータが書き込まれるパスです)。
また、私は ARC を初めて使用するので、これはメモリまたはディスパッチに関連する問題である可能性があります。
助けてくれてありがとう。