2017-12-30 13 views
0

私はCryptoSwift(フレームワーク、Cocoapodsを搭載)でデータの暗号化/復号化を行っています(データあたり約15MB-20MB)。UIProgressViewのデータの暗号化/復号化の観察方法は?

私の質問はどのように進捗状況を観察し、進行状況バー(UIProgressView)に表示できますか?

暗号化/復号化の進行状況を取得(更新)する方法がわかりません。

func aesEncrypt(withKey key: String, iv: String) throws -> Data { 
     let data = self 
     let encrypted = try! AES(key: key.bytes, blockMode: .CBC(iv: iv.bytes), padding: .pkcs7).encrypt([UInt8](data)) 
     let encryptedData: Data = Data(encrypted) 
     return encryptedData.base64EncodedData() 
    } 

これはデータを暗号化する方法に関する私の機能です。 (データ拡張)。

答えて

1

できません。少なくともこのAPIではできません。ブロックごとに暗号化/復号化を試みてください(幸いなことに、AESはブロック暗号です)、ブロックごとに進捗バーを更新してください。

アイデアを得るためにCryptoSwift AESドキュメントの「増分更新」を参照してください:

do { 
    var encryptor = try AES(key: "passwordpassword", iv: "drowssapdrowssap").makeEncryptor() 

    var ciphertext = Array<UInt8>() 
    // aggregate partial results 
    ciphertext += try encryptor.update(withBytes: Array("Nullam quis risus ".utf8)) 
    ciphertext += try encryptor.update(withBytes: Array("eget urna mollis ".utf8)) 
    ciphertext += try encryptor.update(withBytes: Array("ornare vel eu leo.".utf8)) 
    // finish at the end 
    ciphertext += try encryptor.finish() 

    print(ciphertext.toHexString()) 
} catch { 
    print(error) 
} 

https://github.com/krzyzanowskim/CryptoSwift#aes

ジャスト(好ましくはバックグラウンドスレッド/キューに)ループ内でupdate(withBytes:)を使用して進捗状況を更新しますメインのスレッドでこれを行うことを忘れないでください。あなたのチャンクサイズが小さければ小さいほど、進行状況の更新は徐々に進みます。ここで

は、1つのチャンクでデータチャンクを列挙するができる方法です:

let data = ... // your data goes here 
let chunkSize = 64 * 1024 
var chunkStart = 0 
while chunkStart < data.length { 
    let chunk = data.subdata(in: chunkStart..<min(chunkStart + chunkSize, data.length)) 
    ciphertext += try encryptor.update(withBytes: chunk.bytes) 
    ... // update the progress bar here (don't forget to dispatch it to the main thread) 
    chunkStart += chunkSize 
} 

より洗練されたアプローチは、暗号化しているときは、メモリ内のデータを保持する必要はありません、その場合にはInputStreamOutputStreamを、使用することです。私はこの可能性を読者のための練習として探求しています。 (一度に数十メガバイトで作業している限り、メモリが不足することはありません)

+0

ありがとうございました!すぐにこれを試してみます。 Btw;データは文字列ではなく画像です。だから私はイメージをブロックに分割するでしょう、どうすればいいですか? –

+0

@ T.Meyer私は答えを更新しました –

+0

あなたは素晴らしいです!どうもありがとう! –