Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift中与DispatchQueue的同步处理_Ios_Swift_Grand Central Dispatch_Dispatch Queue - Fatal编程技术网

Ios Swift中与DispatchQueue的同步处理

Ios Swift中与DispatchQueue的同步处理,ios,swift,grand-central-dispatch,dispatch-queue,Ios,Swift,Grand Central Dispatch,Dispatch Queue,我有一个方法来处理从服务器接收到的事件。可以从不同类中的多个位置调用该方法。我想使用DispatchQueue/Serial Queue同步事件处理,以丢弃多个调用中的重复事件。我知道调度队列及其工作原理,但无法找到解决问题的最佳解决方案 实现:通过同步,我希望确保顺序处理,放弃重复事件 func process(events:[Events]) { // by synchronizing I want to ensure sequential processing, to discard

我有一个方法来处理从服务器接收到的事件。可以从不同类中的多个位置调用该方法。我想使用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)
}

感谢您的帮助。谢谢

试试这样的方法:

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
        }
    }
}

我认为调度组与解决方案无关。如果要序列化所执行的工作,要为每个调用提供查询已处理哪些事件的机会,请使用serial queue.Yea。我想我想提一下调度队列,但我有点困惑,你能为这个@Avi提供一个解决方案吗?我已经编辑了我的问题。我会确保
事件
是相等和可比较的,并使用
集合
而不是
数组
。否则,这就是我在对这个问题的评论中所建议的。