Как убедиться, что только один поток выполняет фоновый блок контекста - PullRequest
2 голосов
/ 10 июня 2019

В моем приложении есть фоновый поток, который обеспечивает синхронизацию локальной базы данных (основных данных) с сервером.Существует несколько способов запуска обработки (наблюдатель уведомлений, таймер, ...).Однако я хочу убедиться, что только один экземпляр обрабатывает данные одновременно.Итак, если задача обработки запускается во время работы «старой» задачи синхронизации, я хочу, чтобы она дождалась завершения предыдущей задачи.

Мой текущий код выглядит примерно так:

backgroundContext = persistance.persistentContainer.newBackgroundContext()
// this is an instance variable which will be shared by all the threads
...
...
@objc func managedObjectContextDidSave(notification: NSNotification) {
        backgroundContext.perform {
            self.processAllHisotory()
        }
}

Гарантируется ли, что если я выполню несколько задач в одном и том же контексте, они не будут выполняться параллельно?Если нет, то как лучше синхронизировать такие задачи?

1 Ответ

3 голосов
/ 10 июня 2019

Если вы создаете DispatchQueue, это последовательная очередь. Новая задача не может быть запущена во время выполнения задачи. По сути, последовательная очередь является блокировкой.

...