如何防止Swift 4重叠或独占访问错误?

时间:2017-10-05 13:28:25

标签: swift4

我有一个单身课程,可以跟踪我的比赛得分等。

final class PublicData {
    static let sharedInstance: PublicData? = PublicData()

    struct Scores {
        var points = [0, 0]
        subscript(index: Int) -> Int {
            get {return points[index]}
            set(newValue) {
                points[index] += newValue
                print("score\(index): \(points[index])")
                NotificationCenter.default.post(name: Notification.Name(rawValue: "updateScore\(index)"), object: nil)
            }
        }
        mutating func reset() {
            points = [0, 0]
            NotificationCenter.default.post(name: Notification.Name(rawValue: "updateScore0"), object: nil)
            NotificationCenter.default.post(name: Notification.Name(rawValue: "updateScore1"), object: nil)
        }
    }


    var scores = Scores()
}

然后在我的RootViewController中,我更新视图以匹配当前分数。

let data = PublicData.sharedInstance

@objc func updateScore0(_ payload: Notification) {
    let score = data!.scores[0] // line 678
    score0.text = "\(score)"
    // I use matchsticks to show the score
    setMatchScore(score, matchesView: matchesStack0)
}

@objc func updateScore1(_ payload: Notification) {
    let score = data!.scores[1]
    score1.text = "\(score)"
    setMatchScore(score, matchesView: matchesStack1)
}

现在在Swift 4中,我在第678行收到此错误

  

"线程1:同时访问0x608000186ad8,但修改   需要独家访问

我尝试使用let temp = points并使用临时替代但它没有用。 任何人都可以帮助阐明解决方案吗?

这个问题一直被批评为已经得到解答。然而,回答"只是一个视频的链接,虽然解释了错误的概念和原因,但并未解释为什么我遇到它。

大多数编码原则都有记录。 Stack Overflow帮助那些尚未将头围住的人。

将提问者指向文档/视频的方向是徒劳的。有时候,一个人亲自关注你的问题,不仅可以更快地解决问题,而且可以为未来的类似难以理解的概念开启。

1 个答案:

答案 0 :(得分:1)

我解决了我的困境。

我只是将Notification中的有效负载数据从struct传递给RootViewController,而不是从RootViewController读取struct属性。

RootViewController代码

@objc func updateScore0(_ payload: Notification) {
    if let score = payload.userInfo?["score"] as? Int {
        score0.text = "\(score)"
        setMatchScore(score, matchesView: matchesStack0)
    }
}

结构代码

struct Scores {
    var points = [0, 0]
    subscript(index: Int) -> Int {
        get {return points[index]}
        set(newValue) {
            points[index] += newValue
            let payload: [String: Int] = ["score": points[index]]
            print("score\(index): \(points[index])")
            NotificationCenter.default.post(name: Notification.Name(rawValue: "updateScore\(index)"), object: nil, userInfo: payload)
        }
    }
    mutating func reset() {
        points = [0, 0]
        let payload0: [String: Int] = ["score": points[0]]
        let payload1: [String: Int] = ["score": points[1]]
        NotificationCenter.default.post(name: Notification.Name(rawValue: "updateScore0"), object: nil, userInfo: payload0)
        NotificationCenter.default.post(name: Notification.Name(rawValue: "updateScore1"), object: nil, userInfo: payload1)
    }
}