Kolejki wysyłania i asynchroniczny RNCryptor

To jest kontynuacjaAsynchronicznie odszyfruj duży plik za pomocą RNCryptor na iOS

Udało mi się asynchronicznie odszyfrować duży, pobrany plik (60 MB) metodą opisaną w tym poście, poprawioną przez Calmana w jego odpowiedzi.

W zasadzie wygląda to tak:

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

Nadal jednak napotykam problem: całe dane są ładowane do pamięci przed ich odszyfrowaniem. Widzę kilka „Wysłanych X bajtów do deszyfrowania”, a potem ta sama grupa „Decryptor odebrał X bajtów” w konsoli, gdy chcę zobaczyć „Wysłane, odebrane, wysłane, odebrane, .. . ”.

To dobrze w przypadku małych plików (2 MB) lub dużych (60 MB) plików w symulatorze; ale na prawdziwym iPadzie1 zawiesza się z powodu ograniczeń pamięci, więc oczywiście nie mogę utrzymać tej procedury dla mojej aplikacji produkcyjnej.

Czuję, że muszę wysłać dane do deszyfratora za pomocądispatch_async zamiast ślepo wysyłać go wwhile pętla, jednak jestem całkowicie zagubiony. Próbowałem:

tworzenie własnej kolejki przedwhilei używaniedispatch_async(myQueue, ^{ [decryptor addData:data]; });to samo, ale wysyłając cały kod wewnątrzwhile pętlato samo, ale wysyłając całośćwhile pętlaza pomocąRNCryptor-opatrzonyresponseQueue zamiast mojej własnej kolejki

Nic nie działa w tych 4 wariantach.

Nie mam jeszcze pełnego zrozumienia kolejek wysyłki; Czuję, że problem tkwi tutaj. Byłbym szczęśliwy, gdyby ktoś mógł rzucić na to trochę światła.

questionAnswers(3)

yourAnswerToTheQuestion