在 Swift 中使用 DispatchQueue 进行同步处理
Posted
技术标签:
【中文标题】在 Swift 中使用 DispatchQueue 进行同步处理【英文标题】:Synchronous processing with DispatchQueue in Swift 【发布时间】:2018-05-03 17:58:13 【问题描述】:我有一个方法可以处理我从服务器接收到的事件。可以从不同类的多个位置调用该方法。我想使用 DispatchQueue/Serial Queue 同步事件的处理以丢弃多个调用中的重复事件。我知道调度队列以及它是如何工作的,但我无法为我的问题找到最佳解决方案。
要实现:通过同步我想保证顺序处理,丢弃重复的事件。
func process(events:[Events])
// by synchronizing I want to ensure sequential processing, to discard duplicate events
for event in events
// process, save to db,
// issue notifications, etc
class A
process(events)
class B
process(events)
感谢任何帮助。谢谢!
【问题讨论】:
我认为调度组与解决方案没有任何关系。如果你想序列化执行的工作,让每个调用有机会查询哪些事件已经被处理,那么使用串行队列。 是的。我想我想提一下调度队列,但我很困惑,你能提供这个@Avi 的解决方案吗?我已经编辑了我的问题。 【参考方案1】:试试这样的:
class Event
let id: String = ""
class EventManager
static let shared = EventManager()
private let processQueue = DispatchQueue(label: "processQueue")
private var processedEvents = [Event]()
private init()
func process(events:[Event])
processQueue.async [unowned self] in
for event in events
if !self.processedEvents.contains(where: $0.id == event.id )
// process, save to db,
self.processedEvents.append(event)
// issue notifications, etc
【讨论】:
我会确保Event
是等价和可比较的,并使用Set
而不是Array
。否则,这就是我在对该问题的评论中提出的建议。以上是关于在 Swift 中使用 DispatchQueue 进行同步处理的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 swift 的 mac 命令行工具中使用 DispatchQueue.main.async 时需要运行循环?
在使用 Swift 的 iOS 应用程序中使用 DispatchQueue 等待数据从 Cloud Firestore 返回时遇到问题
多线程 - Swift 中的 DispatchQueue asyncAfter 延迟
使用 DispatchQueue 实现 Swift 数组同步
Swift 5:我无法让我的 UITableView 及时更新(同时使用 `DispatchQueue.global().sync` 和 `DispatchQueue.main.async`