Swift 新手:我通过 DispatchQueue.global(qos: .background).async{ code } 使用 GCD 来执行 HealthKit 查询,在执行每个查询之前我需要等待(通过 while/sleep 循环实现)直到 Class static protectedDataEncrypted: Bool(我用来表示 AppleHealth 数据是否已加密且无法访问)为假,我想确保 GCD 永远不会使用主(UI)线程来检查/休眠静态 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 似乎可以防止 UI 冻结,而当我只有 Thread.sleep 时,如果连续快速锁定/解锁屏幕,有时它会冻结。
到目前为止它有效,但我不相信它会在 100% 的时间内有效。
提前谢谢了。