在 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`

如何在 Swift 中测量 DispatchQueue 并发异步中的代码块执行时间?