swift - 解决 iOS Swift 中的数据争用

标签 swift grand-central-dispatch data-race

我有 NetworkProvider,它会连续进行 API 调用,而且一旦我收到数据,我就会更新用户 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
  }
}`

最佳答案

使用 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
    }
}

关于swift - 解决 iOS Swift 中的数据争用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46414628/

相关文章:

ios - 快速将自定义包对象序列化为 json 字符串到 Bool

ios - 从从 Parse.com 中提取的数组中获取索引 - fatal error : Cannot index empty buffer

ios - 使用计时器时 UI 滞后

ios - 使用 Grand Central Dispatch (GCD) 时获取 OSSpinLockLock

go - Go 中的数据竞争 : Why does it happen below 10-11ms?

与 os_unfair_lock_lock 的快速访问竞争

c++ - 在 C++ 中将值从 X 更改为 X 会导致数据竞争吗?

ios - AVSpeechSynthesizer didFinishSpeechUtterance 未被调用

AVFAudio 的 IOS 内存泄漏 - AVAudioSession

ios - 使用目标 : on a selector cancel internal method calls as well? 调用 cancelPreviousPerformRequests