【问题标题】:Resolving Data Race in iOS Swift解决 iOS Swift 中的数据竞争
【发布时间】:2017-09-25 21:42:31
【问题描述】:

我有 NetworkProvider,它将持续调用 api,并且一旦我收到数据,我将更新用户 ID。同时,我将从其他功能访问用户 ID。

这是数据竞争条件,有人可以帮助删除条件。

`

class NetworkProvider  {
   public var userID: String

   func observeStateChange() {

        FIRAuth.auth()?.addStateDidChangeListener({ (auth, authenticatedUser) in
          if let user = authenticatedUser {
              userID = user.uid
          }
       }
    }

   func currentUserID() -> String {
        return self.userID
  }
}`

【问题讨论】:

  • 那么...如果另一个函数在准备好之前尝试访问用户 ID,您希望它如何表现?

标签: swift grand-central-dispatch data-race


【解决方案1】:

使用 DispatchQueue 可以避免数据竞争:

class NetworkProvider  {
    let isolationQueue = DispatchQueue(label: "com.your.domain.xxx", attributes: .concurrent)
    private var _userID: String
    public var userID: String {
        set { isolationQueue.async(flags: .barrier) { self._userID = newValue } }        
        get { return isolationQueue.sync { _userID } }
    }

    func observeStateChange() {

        FIRAuth.auth()?.addStateDidChangeListener({ (auth, authenticatedUser) in
            if let user = authenticatedUser {
                userID = user.uid
            }
        }
    }

    func currentUserID() -> String {
        return self.userID
    }
}

【讨论】:

    猜你喜欢
    • 2019-05-17
    • 2013-10-11
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 2016-12-14
    相关资源
    最近更新 更多