Swift 在os x中,会话共享无法从特权类工作
我正在开发一个OSX应用程序,它处理mac os中的用户密钥链。 我有一个管理会话数据的单例类和一个特权机制(没有任何GUI)。我想通过Singleton对象共享特权类中的数据。但它不起作用。 这是我的代码示例Swift 在os x中,会话共享无法从特权类工作,swift,macos,singleton,data-sharing,Swift,Macos,Singleton,Data Sharing,我正在开发一个OSX应用程序,它处理mac os中的用户密钥链。 我有一个管理会话数据的单例类和一个特权机制(没有任何GUI)。我想通过Singleton对象共享特权类中的数据。但它不起作用。 这是我的代码示例 The Privileged Class: class ReadKeychain: AuthorizationContext { @objc func run(){ var singletonObj = SingletonState.shared
The Privileged Class:
class ReadKeychain: AuthorizationContext {
@objc func run(){
var singletonObj = SingletonState.shared
singletonObj.oktaAuthenticationStatus = status
}
}
和singleton类对象:
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:字符串?{
得到{
返回internalQueue.sync{
返回OktaAuthStatus.status
}
}
集合(新闻状态){
internalQueue.async(标志:。屏障){
self.OktaAuthStatus.status=newStatus
}
}
}
或者更好的是,如果您有少量状态,则将其设置为枚举,并添加一个类似
.none
的选项作为默认值。那么变量就不是可选的。谢谢您的回答@安东巴洛克实际上我试过。。但是这不起作用,当我把另一个类设置为非特权类时,它工作得很好!!