首页 > 解决方案 > 会话共享在 os x 的特权类中不起作用

问题描述

我正在开发一个处理 mac os 中用户钥匙串的 os x 应用程序。我有一个管理会话数据的 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
            }
        }
    }
}

标签: swiftmacossingletondata-sharing

解决方案


不确定它是否与问题有关,但是。你在这里有一个潜在的强制展开引发的崩溃。

当 for 的值oktaAuthenticationStatus尚未设置但已被读取时,就会发生这种情况。我建议您将此变量的类型更改为可选并删除强制展开:

var oktaAuthenticationStatus: String? {
    get {
        return internalQueue.sync {
            return OktaAuthStatus.status
        }
    }
    set (newStatus) {
        internalQueue.async(flags: .barrier) {
            self.OktaAuthStatus.status = newStatus
        }
    }
}

或者更好的是,如果您有少量状态,请将其设为枚举并添加一个选项,例如.none使其成为默认值。那么该变量将不是可选的。


推荐阅读