Синхронная обработка с DispatchQueue в Swift - PullRequest
0 голосов
/ 03 мая 2018

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

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

1 Ответ

0 голосов
/ 03 мая 2018

Попробуйте что-то вроде этого:

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