我有一个视图模型,其数据源可以更新两种方式中的一种。
有一个
func fetchData()
函数可以从服务器异步获取一些数据。
此 ViewModel 正在使用一个单独的 WebSocket 类/管理器,当发送一些数据时,它会从 websocket 接收数据。
这两者都需要在同一个数据源上操作
var datasource: [MyData]
确保数据源准确且最新的最佳方法是什么?
在 #1 和 #2 中,我是否应该将它们返回的任何结果分派给一个单独的函数,该函数会将一些工作分派给异步串行队列,以确保永远不会有 2 个队列/线程尝试同时对我的数据源进行操作?
类似...
func fetchData() {
...
{ [weak self] fetchResult in
self?.updateDataSource(fetchResult)
}
...
}
func websocketDataDidUpdate() {
...
{ [weak self] socketResult
self?.updateDataSource(fetchResult)
}
...
}
let serialQueue = DispatchQueue(label: "com.blah.className.datasourceSerialQueue")
func updateDataSource(data: [MyData]) {
serialQueue.async {
//do data updates in here. Sometimes replace all data, sometimes potentially look for a delta and only replace the delta
}
}
是的,你应该这样做。
不仅可以避免创建垃圾数据,还可以对数据源进行多线程读写。
此外,您应该避免在 fetch 和 websocket 之间混合两种类型的修改,这很容易出错,因为您无法确保从两个单独的通道接收“替换增量”任务的正确顺序。