【发布时间】:2021-07-27 07:57:00
【问题描述】:
我的目标是以定期有效负载的形式将异步加速度计读数发送到服务器。
加速度计数据在离线和网络请求期间同时继续,因此我需要处理网络故障以及在每个网络请求期间到达的数据。
我不优雅的方法是将每个新更新附加到一个数组中:
motionManager.startAccelerometerUpdates(to: .main) { data, error in
dataArray.append(data)
}
然后定期向服务器发送一组值(network 是我对NWPathMonitor() 的包装):
let timer = Timer(fire: Date(), interval: 5, // Every 5 seconds
repeats: true, block: { timer in
if network.connected {
postAccelerometerData(payload: dataArray) { success
if success {
dataArray.removeAll()
}
}
}
})
RunLoop.current.add(timer, forMode: RunLoop.Mode.default)
这种方法的主要问题是,在网络请求触发和完成之间添加的数组元素会从数组中删除,而不会发送到服务器。
我有一些关于为每个网络请求添加队列和出队 X 元素的想法(但是如果请求失败,我是否将它们添加回队列?)。
我不禁想到有更好的方法来解决这个问题,使用 Combine 将这些加速度计更新“流式传输”到某种数据结构以缓冲它们,然后将它们发送到服务器。
postAccelerometerData() 函数只是对 JSON 结构进行编码并发出网络请求。那里没什么特别的。
【问题讨论】:
-
您提出的问题过于宽泛且主观。什么是“使用 Combine 的优雅方式”?你到底有什么困难?数据是“传感器数据”是否重要?而这个可以定期发送到服务器的数据队列究竟是什么?我的建议是尽量减少问题,将重点放在关注的领域,显示一些代码,如果有 inelegant 方式(或彻底坏掉) - 也显示出来。
-
@NewDev 谢谢你的建议。我已经将问题的范围缩小到加速度计数据,并提供了我当前的 inelegant 方法。我的直觉说
Combine可以更好地处理这种设计,因为它是来自Accelerometer -> Local Data Buffer of some form -> Server的“流”值
标签: swift networking buffer sensors combine