Bulk 是一个用于缓冲对象的库。管道 (Sink) 接收对象,并将缓冲后的对象批量发送。
在某些情况下,打包大量元素会很有帮助。例如,使用内部 API 发送您产品的分析事件。
我们将接收对象的管道称为 Sink
。
Sink
接收对象,并将缓冲后的对象批量发送到多个目标。
要创建 bulk,我们可以选择几种类型的缓冲区。
目前,Bulk 提供以下两种类型。
在本教程中,我们选择 MemoryBuffer。
Target(目标)从 Sink 接收批量处理后的对象。
Bulk 没有提供默认实现的 Target。
现在,您需要自己创建它。
public protocol TargetType {
associatedtype Element
func write(items: [Element])
}
struct MyTarget<Element>: TargetType {
func write(items: [Element]) {
print(items)
}
}
最后,创建 BulkSink 对象。
let sink = BulkSink<String>(
buffer: MemoryBuffer.init(size: 10).asAny(),
targets: [
MyTarget<String>().asAny()
]
)
发送对象
sink.send("A")
sink.send("B")
sink.send("C")
当 Buffer 接收的对象达到指定大小(示例中为 10 个元素)时,sink
会发送批量处理后的对象。
Logger 是基于 Bulk 之上的一个库。
BulkLogger 提供 Logger
对象,该对象封装了内部的 Sink
。
let logger = Logger(context: "", sinks: [
BulkSink<LogData>(
buffer: MemoryBuffer.init(size: 10).asAny(),
targets: [
TargetUmbrella.init(
transform: LogBasicFormatter().format,
targets: [
LogConsoleTarget.init().asAny()
]
).asAny(),
OSLogTarget(subsystem: "BulkDemo", category: "Demo").asAny()
]
)
.asAny()
])
Logger 对象将日志数据发送到 2 个目标 (LogConsoleTarget 和 OSLogTarget)。
logger.verbose("Hello")
Bulk Framework 在 MIT 许可证下发布。