swift - 如何在不复制的情况下将“数据”对象放入 Swift-NIO?
问题描述
我对 Swift很陌生,对 NIO 也很陌生。
我正在将 Swift 代码添加到需要将大量数据 (GB) 上传/下载到 AWS 的大型项目中。为此,我导入了严重依赖 NIO的 GitHub 项目Soto 。
大多数发送/接收数据的方法都是通过ByteBuffer
结构来完成的。我的应用程序已经有数据要上传到 FoundationData
对象中。我很难找出将这些Data
对象放入 NIO 的最佳方法。
在NIO ByteBuffer
(2.26.0)的文档中,它指出
支持的类型:可以从 ByteBuffer 读取/写入多种类型。...开箱即用,ByteBuffer 支持例如以下类型(非详尽列表):
- 字符串/静态字符串
- Swift 的各种(无符号)整数类型
- 基金会资料
- [UInt8] 通常是 UInt8 的任何集合
但是,最新的 swift-nil 包不ByteBuffer
支持 FoundationData
对象。相反,它支持DispatchData
对象,而对象又似乎与对象没有互操作性Data
。
我要避免的是复制每个数据块(一次 100 MB),只是为了在Data
和DispatchData
类型之间进行转换。
所以...
现在我的想法是其中之一
我完全迷路了,我还没有找到一个简单的解决方案
解决方案是创建一个由对象
DispatchData
支持的子类Data
使用指向对象中原始字节数组的非复制初始化器创建的
ByteBuffer
结构,以及一个简单地保留对象直到和对象被销毁的自定义释放器。DispatchData
Data
Data
ByteBuffer
DispatchData
我将不胜感激任何想法、经验或建议(特别是如果它是选项#1)。
解决方案
您需要import NIOFoundationCompat
获取任何适用于(或/ )Foundation
等数据类型的 NIO 方法。只是包的另一个模块,因此您不需要另一个依赖项。Data
JSONDecoder
JSONEncoder
NIOFoundationCompat
swift-nio
但要明确一点,在幕后,总会有副本,但您可能不需要担心它们,副本在当今的 CPU 上非常快。如果您绝对想避免复制,则需要立即创建ByteBuffer
s。为了帮助您解决这个问题,您可能需要添加从哪里获取您想要通过网络发送的数据。
推荐阅读
- oracle12c - ORA-1458:变量字符串中的长度无效,ORA-01483:DATE 或 NUMBER 绑定变量的长度无效
- javascript - ES6 双重解构
- c# - 在多线程性能中读取静态变量与从 mongodb 读取
- c# - TDD:内存提供程序中的 EF Core 是否验证引用约束?
- pytorch - 用外行术语来说,pytorch 中的聚集函数有什么作用?
- ios - 从 url 请求书签总是发布错误消息
- selenium - 如何在 POM 设计中传递驱动程序详细信息
- python - CSV数据的每小时平均数据
- python - 我希望每 60 秒后循环在 google chrome 上打开 youtube url 并刷新它然后关闭
- angular - Angular Nx 和 NgRx:应用程序没有响应