通过获取和 websocket 检索数据...到单个数据源中。我应该使用串行队列来确保非垃圾数据吗?

问题描述 投票:0回答:1

我有一个视图模型,其数据源可以更新两种方式中的一种。

  1. 有一个

    func fetchData()
    函数可以从服务器异步获取一些数据。

  2. 此 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
  }
}

swift multithreading grand-central-dispatch
1个回答
0
投票

是的,你应该这样做。

不仅可以避免创建垃圾数据,还可以对数据源进行多线程读写。

此外,您应该避免在 fetch 和 websocket 之间混合两种类型的修改,这很容易出错,因为您无法确保从两个单独的通道接收“替换增量”任务的正确顺序。

© www.soinside.com 2019 - 2024. All rights reserved.