Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 在os x中,会话共享无法从特权类工作_Swift_Macos_Singleton_Data Sharing - Fatal编程技术网

Swift 在os x中,会话共享无法从特权类工作

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

我正在开发一个OSX应用程序,它处理mac os中的用户密钥链。 我有一个管理会话数据的单例类和一个特权机制(没有任何GUI)。我想通过Singleton对象共享特权类中的数据。但它不起作用。 这是我的代码示例

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
      的选项作为默认值。那么变量就不是可选的。

      谢谢您的回答@安东巴洛克实际上我试过。。但是这不起作用,当我把另一个类设置为非特权类时,它工作得很好!!