「Swift」DispatchSemaphore信号量使用方法

392 阅读1分钟
前言:有时候代码需要运用一些系统值进行选择判断运行,但系统值执行较慢,会影响其他部分代码的运行结果,此时如何让代码按照我们所预期的顺序进行运行呢?
此时需要将部分代码进行延迟运行,待到系统值运行结束后,就立即运行判断代码

举个例子,来更好的理解:
比如我要获取系统的通知权限是否开启,如果开启则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任务部分先进行线程挂起,等待通知权限判断完之后,再进行线程恢复,继续运行。
在这里插入图片描述
这就使用信号量让代码按照我们预想的状态进行运行。