Во-первых, вам не нужны ваши protectedDataEncrypted
. Это уже доступно непосредственно как UIApplication.shared.isProtectedDataAvailable
.
То, что вы хотите, это очередь, которую вы можете остановить. Так что создайте очередь для обработки вещей. Если защищенные данные недоступны, приостановите их.
let protectedQueue = DispatchQueue(label: "protected")
if !UIApplication.shared.isProtectedDataAvailable {
protectedQueue.suspend()
}
Теперь все, что помещено в эту очередь с использованием protectedQueue.dispatchAsync
, будет запущено немедленно, если это возможно, или просто будет поставлено в очередь, если нет.
Затем вы можете включать и выключать очередь, как вы делаете.
override func applicationProtectedDataDidBecomeAvailable(_ application: UIApplication) {
protectedQueue.resume()
}
override func applicationProtectedDataWillBecomeUnavailable(_ application: UIApplication) {
protectedQueue.suspend()
}
Все это говорит о том, что обычно лучше просто построить свои операции, чтобы слепо пытаться выполнить их самостоятельно, а затем обрабатывать ошибки в случае их неудачи, а не проверять, считаете ли вы, что это будет успешно. Существуют условия гонки, при которых вы можете успешно начать операцию, но защита данных может сработать до того, как вы закончите. Вы должны разобраться с этим делом. Поскольку вы должны обрабатывать этот случай, вы обычно должны просто разрешить тому обработчику, как вы обрабатываете отсутствие доступа.
Но в тех случаях, когда проверка перед полетом может быть полезна или если она влияет на видимые пользователю элементы, тогда может быть полезно вышеуказанное.
Опрос sleep
никогда не является ответом. Даже если вы хотите опросить (чего следует избегать, если это вообще возможно), вы никогда не должны использовать Thread.sleep
. Это связывает весь поток и предотвращает использование чего-либо еще. Если вы вынуждены это сделать, способ опроса заключается в перепланировании себя с помощью dispatchAfter
.