Глобальные очереди отправки одновременные, , так что не защищает вашу функцию от одновременного вызова из нескольких потоков.
Если вы хотите сериализовать доступ к ресурсам, вам необходимосоздать serial очередь:
let myQueue = DispatchQueue(label: "myQueue", qos: .userInitiated)
Затем все рабочие элементы, отправленные в эту очередь, выполняются последовательно:
myQueue.async {
changeSomeResources()
}
Обратите внимание, что UIApplication
- какРесурс, связанный с пользовательским интерфейсом - должен быть доступен только в главном потоке:
DispatchQueue.main.async {
// working with UIApplication.shared
}
Xcode также имеет параметры «Обеззараживатель потоков» и «Проверка основного потока» (на панели «Диагностика» настроек схемы), которые могутпомогите обнаружить проблемы с многопоточностью.