2017-10-05 3 views
1

J'ai une classe singleton qui suit le score de mon jeu entre autres choses. Puis dans mon RootViewController, je mets à jour la vue pour qu'elle corresponde aux scores actuels. Puis, dans le RootViewController,Comment empêcher le chevauchement de Swift 4 ou une erreur d'accès exclusif?

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) 
} 

maintenant à Swift 4 je reçois cette erreur sur la ligne 678

« Discussion 1: accès simultané à 0x608000186ad8, mais la modification nécessite un accès exclusif

J'ai essayé d'utiliser let temp = points et à l'aide temporaire à la place, mais il ne fonctionnait pas. quelqu'un peut-il aider à faire la lumière sur une solution?


Cette question a été critiquée comme étant déjà répondu. Cependant, la "réponse" était simplement un lien vers une vidéo qui, bien qu'ayant expliqué le concept et la raison de l'erreur, n'explique pas clairement pourquoi je la rencontre.

La plupart des principes de codage sont documentés. Stack Overflow aide ceux qui n'ont pas encore enveloppé leur tête autour d'eux.

Montrer du doigt interrogateurs vers la direction de la documentation/vidéo est inutile. Parfois, quelqu'un qui se concentre personnellement sur VOTRE problème avec vous résout non seulement plus rapidement, mais allume la lumière pour des concepts similaires difficiles à saisir à l'avenir.


+0

double possible de [simultanée accès à 0x1c0a7f0f8, mais la modification nécessite erreur d'accès exclusif sur Xcode 9 beta 4] (https://stackoverflow.com/questions/45415901/simultanée-accès à 0x1c0a7f0f8 mais modification_colonne nécessite un accès exclusif-)- – the4kman

+0

Je l'ai regardé. Ça ne m'a pas aidé. –

Répondre

0

J'ai résolu mon dilemme.

J'ai simplement passé les données utiles dans la notification à la RootViewController de la struct au lieu de lire la propriété struct du RootViewController.

Code RootViewController

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

Code Struct

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) 
    } 
}