解决iOS Swift中的数据竞争问题

时间:2017-09-25 21:42:32

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

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

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

`

 13 import numpy as np #math

 14 

1 个答案:

答案 0 :(得分:4)

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