Синхронная обработка с DispatchQueue в Swift

У меня есть метод, который обрабатывает события, которые я получаю с сервера. Метод можно вызывать из нескольких мест в разных классах. Я хочу синхронизировать обработку событий с помощью 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)
}

Любая помощь приветствуется. Спасибо!


person hacker_1989    schedule 03.05.2018    source источник
comment
Я не думаю, что диспетчерские группы имеют какое-то отношение к решению. Если вы хотите сериализовать выполненную работу, чтобы дать возможность каждому вызову запрашивать, какие события уже были обработаны, используйте последовательную очередь.   -  person Avi    schedule 03.05.2018
comment
Да. Думаю, я хотел упомянуть очередь отправки, но я запутался, можете ли вы предоставить решение для этого @Avi? Я отредактировал свой вопрос.   -  person hacker_1989    schedule 03.05.2018


Ответы (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
        }
    }
}
person Jake    schedule 03.05.2018
comment
Я бы убедился, что Event уравновешен и сравним, и использовал бы Set вместо Array. В противном случае это то, что я предложил в своем комментарии к вопросу. - person Avi; 03.05.2018