2017-03-09 6 views
1

まず、これは私がその質問を見て、カップルの他の人と、私のクラスは、アイデンティティインスペクタと同様に接続インスペクタを介して接続されていることを確認してきているWhat does this mean? "'NSUnknownKeyException', reason: … this class is not key value coding-compliant for the key X"このクラスは、キーXXXに対応するキー値をコード化していません - 正しくクラスされたクラスですか?

の複製ではありません。私のクラスは、アシスタントエディタの自動モードでも表示されます。

if let currentUser = FIRAuth.auth()?.currentUser { 

     ref = FIRDatabase.database().reference() 
     ref.child("Teams").child(self.teamName.text!).setValue(["Name" : self.teamName.text!]) 
     ref.child("Teams").child(self.teamName.text!).setValue(["Number" : self.teamNumber.text!]) 
     ref.child("Teams").child(self.teamName.text!).setValue(["Password" : self.teamPassword.text!]) 
     ref.child("Teams").child(self.teamName.text!).setValue(["memberCount" : 1]) 
     print("1") 

     let userName = "member" + String(1) 
     let currentUserEmail = currentUser.uid 
     ref.child("Teams").child(self.teamName.text!).child("memberList").setValue([userName : currentUserEmail]) 
     print("2") 

     if let userteamcount = self.ref.child("Users").child(currentUser.uid).value(forKey: "teamCount") as? Int { 
      let currentTeam = "team" + String(userteamcount + 1) 
      print("4") 
      self.ref.child("Users").child(currentUser.uid).setValue(["teamCount" : (userteamcount + 1)]) 
      print("5") 
      self.ref.child("Users").child(currentUser.uid).child("joinedTeams").setValue([currentTeam : self.teamNumber.text!]) 
      print("6") 
     } 
    } 

重要な注意点は、エラーを送信する前に1と2が出力されることです。

1 
2 
Terminating app due to uncaught exception 'NSUnknownKeyException', reason: 
'[<FIRDatabaseReference 0x618000054160> valueForUndefinedKey:]: 
this class is not key value coding-compliant for the key teamCount.' 

本当にありがとうございました:

また、ここで私が手specficエラーです。

+1

'子(currentUser.uid).VALUE(forKey: "teamCount")'がクラッシュしますが、この 'child'は' teamCount'特性を持っており、それはdoesnのことを想定しているので、 't。 – matt

答えて

2
self.ref.child("Users").child(currentUser.uid).value(forKey: "teamCount") as? Int 

DBから値を取得することはできません。あなたは値を得るために参照を観察する必要があります。しかし、あなたは値を増やそうとしているようですので、とにかくそれを行うにはトランザクションを使用する必要があります。そうでないと、2人のユーザーが同じ時間にそれを増やそうとしたときに、変更がもう一方のものを上書きする可能性が高いからです(個人的に、私はそれもより読みやすいと思います)。方法は次のとおりです。

self.ref.child("Users").child(currentUser.uid).child("teamCount").runTransactionBlock({ (currentData: FIRMutableData) -> FIRTransactionResult in 
    var teamCount = currentData.value as? Int 
    if teamCount != nil { 
    currentData.value = teamCount + 1 
    } 
    return FIRTransactionResult.success(withValue: currentData) 
}) { (error, committed, snapshot) in 
    if error == nil { 
     // Update joinedTeams here 
     let value = snapshot.value as? Int 
     let currentTeam = "team\(value)" 
     self.ref.child("Users").child(currentUser.uid).child("joinedTeams").child(currentTeam).setValue(self.teamNumber.text!) 
    } 
} 

通常、トランザクションなしでDBからteamCountをロードする方法は次のとおりです。

self.ref.child("Users").child(currentUser.uid).child("teamCount").observeSingleEvent(.value, with: { dataSnapshot in 
    let teamCount = dataSnapshot.value as? Int 
}) 

私はコードをテストしていませんが、動作するはずです。

リンク:

Firebase Transactions

+0

そこに小さな誤りがあってそれを修正しました。 –

関連する問題