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

Posted

技术标签:

【中文标题】如何防止 Swift 4 重叠或独占访问错误?【英文标题】:How do I prevent Swift 4 overlap or exclusive access error? 【发布时间】:2018-03-17 03:31:26 【问题描述】:

我有一个单例类来跟踪我的游戏分数。

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 并改用 temp,但它没有用。 任何人都可以帮助阐明解决方案吗?


此问题已被批评为已得到解答。然而,“答案”只是一个视频链接,虽然解释了错误的概念和原因,但并没有清楚地解释我遇到它的原因。

大多数编码原则都有记录。 Stack Overflow 可以帮助那些还没有完全理解它们的人。

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


【问题讨论】:

Simultaneous accesses to 0x1c0a7f0f8, but modification requires exclusive access error on Xcode 9 beta 4的可能重复 我看过了。它没有帮助我。 【参考方案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)
    

【讨论】:

以上是关于如何防止 Swift 4 重叠或独占访问错误?的主要内容,如果未能解决你的问题,请参考以下文章

独占打开文件/锁定文件

隐藏警告:同时访问...但修改需要独占访问

如何以模式锁定 macOS 卷以进行独占读/写访问?

交换数组元素显示错误:同时访问但修改需要独占访问

Swift 高级特性

Swift学习笔记-内存安全性