【问题标题】:Synchronous processing with DispatchQueue in Swift在 Swift 中使用 DispatchQueue 进行同步处理
【发布时间】: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 的解决方案吗?我已经编辑了我的问题。

标签: ios swift grand-central-dispatch dispatch-queue


【解决方案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。否则,这就是我在对该问题的评论中提出的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-11
  • 2018-05-09
  • 1970-01-01
相关资源
最近更新 更多