swift - 在 Swift 3 中将数据拆分为 block

标签 swift upload chunks

我需要通过网络以 5MB 的 block 发送从照片库读取的图像。

我使用以下方法从库中读取图像:PHImageManager.requestImageData(for:options:resultHandler:) 并获得一个Data 对象。然后我想有效地将​​数据分成 block (不复制内存)。最好的方法是什么?

这是我目前所拥有的:

    imageData.withUnsafeBytes { (unsafePointer: UnsafePointer<UInt8>) -> Void in

        let totalSize = data.endIndex
        var offset = 0

        while offset < totalSize {
            let chunkSize = offset + uploadChunkSize > totalSize ? totalSize - offset : uploadChunkSize
            let chunk = Data(bytesNoCopy: unsafePointer, count: chunkSize, deallocator: Data.Deallocator.none)

            // send the chunk...

           offset += chunkSize
        }
    }

但是我在编译时遇到这个错误:

无法将“UnsafePointer”类型的值转换为预期的参数类型“UnsafeMutableRawPointer”

如果我使用 mutableBytes:

data.withUnsafeMutableBytes { (unsafePointer: UnsafeMutablePointer<UInt8>) -> Void in... }

然后我得到编译时错误:

不能在不可变值上使用可变成员:“data”是“let”常量

这是正确的,因为我真的不想更改图像数据。我只想一次发送其中的一部分。

有更好的方法吗?

最佳答案

您好!

我需要相同的行为并想出了这个解决方案。您指出了正确的错误,解决方案只是使用 UnsafePointer 地址创建 UnsafeMutableRawPointer。这是我找到的最快的解决方案。

另一件事是在创建 block 时将偏移量添加到 mutRawPointer 的基地址。

2MB block 中的 50MB 数据大约需要 0.009578s

func createChunks(forData: Data) {

    imageData.withUnsafeBytes { (u8Ptr: UnsafePointer<UInt8>) in
        let mutRawPointer = UnsafeMutableRawPointer(mutating: u8Ptr)
        let uploadChunkSize = 2097152
        let totalSize = imageData.count
        var offset = 0

        while offset < totalSize {

            let chunkSize = offset + uploadChunkSize > totalSize ? totalSize - offset : uploadChunkSize
            let chunk = Data(bytesNoCopy: mutRawPointer+offset, count: chunkSize, deallocator: Data.Deallocator.none)
            offset += chunkSize
        }
    }
}

关于swift - 在 Swift 3 中将数据拆分为 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42584438/

相关文章:

ios - 快速将多个独立项目居中

android - 使用 Retrofit 2 上传视频

php - MYSQL php数据库插入包括图像上传

video - MediaRecorder - 如何在录制时播放视频 block / block ?

c# - Filestream.Read 返回值是什么意思?如何分块读取数据并进行处理?

python - pandas read_csv 中最大化速度的最佳 block 大小是多少?

ios - 在主 Storyboard顶部呈现锁定屏幕

ios - 在添加的 CocoaPods 项目中找不到一些导入

swift - 为什么需要使用HMCharacteristic的readValue来获取当前值?

java - 离线同步文件: Upload ArrayList or Upload in a for loop