作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有 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/
我是一名优秀的程序员,十分优秀!