Swift Newbie: я использую GCD через DispatchQueue.global (qos: .background) .async {code} для выполнения запросов HealthKit, перед выполнением каждого запроса мне нужно подождать (реализовано с помощью цикла while / sleep) до тех пор, пока класс static protectedDataEncrypted не станет статическим: Bool (который я использую, чтобы обозначить, зашифрованы ли данные AppleHealth и недоступны) является ложным, я хочу убедиться, что GCD никогда не будет использовать поток Main (UI) для проверки / спящего режима static protectedDataEncrypted: Bool, так как это заморозит приложение .
Пока что подход, который я использовал, работает, но я не уверен на 100%, что он не будет блокироваться, если GCD по какой-то причине использует основной поток для проверки / засыпания статического Bool, что было бы лучше, чем использование спать, в соответствии с моим кодом ниже?
В AppDelegate: у меня есть следующее:
static var protectedDataEncrypted = false
override func applicationProtectedDataDidBecomeAvailable(_ application: UIApplication) {
AppDelegate.protectedDataEncrypted = false
}
override func applicationProtectedDataWillBecomeUnavailable(_ application: UIApplication) {
AppDelegate.protectedDataEncrypted = true
}
В отдельном классе с методом, который вызывается DispatchQueue.global (qos: .background) .async {code}, у меня есть следующий метод, вызываемый перед выполнением запроса HealthKit
func waitTillUnencrypted(){
while (AppDelegate.protectedDataEncrypted){
DispatchQueue.global(qos: .background).sync {
Thread.sleep(forTimeInterval: 2)
}
}
}
Примечание: использование DispatchQueue.global (qos: .background) .sync для вызова Thread.sleep, похоже, предотвращает зависание пользовательского интерфейса, тогда как, когда у меня был только Thread.sleep, иногда он зависал, если бы быстро блокировать / разблокировать экран непрерывно.
Пока это работает, но я не уверен, что он будет работать в 100% случаев.
Спасибо заранее.