问题描述
我正在开发一个OS X应用程序,该应用程序处理Mac OS中的用户钥匙串。 我有一个用于管理会话数据的Singleton类,以及一个特权机制(没有任何GUI)。我想通过Singleton对象共享特权类中的数据。但这不起作用。 这是我的代码示例
The Privileged Class:
class ReadKeychain: AuthorizationContext {
@objc func run(){
var singletonObj = SingletonState.shared
singletonObj.oktaAuthenticationStatus = status
}
}
和单例类对象:
class SingletonState {
static let shared = SingletonState()
private init(){}
private let internalQueue = dispatchQueue(label: "com.tecmfa.singletonstateinternal.queue",qos: .default,attributes: .concurrent)
private struct _oktaAuthentication
{
var status: String?
}
private var OktaAuthStatus = _oktaAuthentication()
/// oktaAuthentication reference
var oktaAuthenticationStatus: String {
get {
return internalQueue.sync {
return OktaAuthStatus.status!
}
}
set (newStatus) {
internalQueue.async(flags: .barrier) {
self.OktaAuthStatus.status = newStatus
}
}
}
}
- 如果我将该类声明为非特权类,那就很好用
- 但我需要获得特权
解决方法
不确定是否与问题有关。 您在这里可能会因力解开而导致崩溃。
当oktaAuthenticationStatus
的值尚未设置但已经被读取时,就会发生这种情况。我建议您将此变量的类型更改为可选,并删除强制拆开:
var oktaAuthenticationStatus: String? {
get {
return internalQueue.sync {
return OktaAuthStatus.status
}
}
set (newStatus) {
internalQueue.async(flags: .barrier) {
self.OktaAuthStatus.status = newStatus
}
}
}
或者更好的是,如果您的状态数量很少,请将其设为枚举并添加一个选项.none
作为默认值。那么该变量将不是可选的。