前言:有时候代码需要运用一些系统值进行选择判断运行,但系统值执行较慢,会影响其他部分代码的运行结果,此时如何让代码按照我们所预期的顺序进行运行呢?
此时需要将部分代码进行延迟运行,待到系统值运行结束后,就立即运行判断代码
举个例子,来更好的理解:
比如我要获取系统的通知权限是否开启,如果开启则print(true),如果没有开启则print(false)
使用信号量代码:
var NotificationPermission:Bool = false
//获取通知权限
UNUserNotificationCenter.current().getNotificationSettings { setting in
if setting.authorizationStatus != .denied {
NotificationPermission = true
print("====通知权限1:"+String(NotificationPermission))
} else {
NotificationPermission = false
print("====通知权限1:"+String(NotificationPermission))
}
}
print("====通知权限2:"+String(NotificationPermission))
//task任务
//NotificationPermission ? print(true) : print(false)
运行的结果:
这与我们所预想的完全不同,我们预想是“通知权限1”判断完后,才执行“通知权限2”。此时我们就可以用信号量,来让task任务部分先等待通知权限判断完后再执行
添加信号量后的代码:
var NotificationPermission:Bool = false
let semaphore = DispatchSemaphore(value: 0)
//获取通知权限
UNUserNotificationCenter.current().getNotificationSettings { setting in
if setting.authorizationStatus != .denied {
NotificationPermission = true
print("====通知权限1:"+String(NotificationPermission))
} else {
NotificationPermission = false
print("====通知权限1:"+String(NotificationPermission))
}
//线程恢复
semaphore.signal()
}
//线程挂起
semaphore.wait()
print("====通知权限2:"+String(NotificationPermission))
//task任务
//NotificationPermission ? print(true) : print(false)
将task任务部分先进行线程挂起,等待通知权限判断完之后,再进行线程恢复,继续运行。
这就使用信号量让代码按照我们预想的状态进行运行。