これは私の2番目のバージョンで、Firebaseからコードを取得しようとしています。これは、エラーコードでクラッシュしFirebaseからデータを正しく取得できません
channelRef?.observe(.childChanged, with: { (snapshot) -> Void in
let update = snapshot.value as! Dictionary<String, AnyObject>
var readyToGoValue: Bool?
var userID: String?
var amountOfPlayers: Int?
var changedCreator: String?
if let updatedReadyToGo = update["readyToGo"] as! Bool!{
if updatedReadyToGo == true
{
readyToGoValue = true
}
else
{
readyToGoValue = false
}
}
if let updateduserID = update["userID"] as! String!{
userID = updateduserID
}
if let updatedAmountOfPlayers = update["currentPlayers"] as! Int!{
amountOfPlayers = updatedAmountOfPlayers
}
if let updateduserID = update["userID"] as! String!{
userID = updateduserID
}
if let updatedCreator = update["creator"] as! String!{
changedCreator = updatedCreator
}
let currentUser = FIRAuth.auth()?.currentUser?.uid
if changedCreator != nil
{
print("changed creator")
self.creator = changedCreator!
}
:
は、型の値をキャストすることができませんでした「__NSCFString」(0x10a77f4a0)「NSDictionaryの」(0x10a780288)にこれは私がそれを第二の方法を行ってどのようです。行 "更新"で。これは私の最初の試みでした:
channelRef?.observe(.childChanged, with: { (snapshot) -> Void in
let value = snapshot.value as? NSDictionary
let readyToGoValue = value?["readyToGo"] as? Bool ?? false
let userID = value?["userID"] as? String ?? ""
var amountOfPlayers = value?["currentPlayers"] as? Int ?? 0
let changedCreator = value?["creator"] as? String ?? ""
print(snapshot)
let currentUser = FIRAuth.auth()?.currentUser?.uid
print(changedCreator)
print(amountOfPlayers)
if changedCreator != ""
{
print("changed creator")
self.creator = changedCreator
}
これはうねっていません。 Firebaseに作成者(単なる文字列)を変更する場合は、印刷を追加するとき、私はプリントとして(スナップショット)これを取得する:
スナップ(クリエイター)HI
プリント(「変更された作成者」)が実行されませんでししかし、 。どうしてこれなの?
編集:
print("path channel ref: " + "\(self.channelRef)")
print("snapshot: " + "\(snapshot)")
print("value: " + "\(value)")
-pathチャネルは:ref:オプション(https://X.com/channels/-KeGKaJavH6uPYaSa7k4)
-snapshot:スナップ(これは私がchannelRef?:
super.prepare(for: segue, sender: sender)
if let channel = sender as? Channel {
let chatVc = segue.destination as! channelMultiplayerViewController
chatVc.channel = channel
chatVc.channelRef = channelRef.child(channel.id)
chatVc.usersKey = userKey
}
印刷より多くのデータを得た方法でありますクリエイター)newクリエイター
- 値:なし
更新:
データ構造:
これは今のために働くが、そこより良いアプローチではないでしょうか?:
if snapshot.key == "creator"
{
changedCreator = snapshot.value as! String
}
別の問題、上記のが、最初の問題の解決策とまったく同じことが、この問題は解決されません。最初の子ノードを取得しようとすると、その最初のユーザーが、そのuserIDを取得しようとすると、何も機能しません。私はこのコードを使用します:
let firstChild = UInt(1)
self.channelRef?.queryLimited(toFirst: firstChild).observeSingleEvent(of: .value, with: { (snapshot) in
let value = snapshot.value as? NSDictionary
print(snapshot)
print(value)
let newCreator = value?.value(forKey: "userID") as? String
if newCreator != nil{
print("Got the userID")
}
if snapshot.key == "userID"
{
print("Got the userID")
}
})
Snap (-KeJWMiXaL-FGp0J7b3u) {
"-KeJWO0V9kxgGnrACAtP" = {
PictureVersion = 2;
readyToGo = 0;
userID = SZlQ76RLCJQpFa0CDhrgFJoYzrs2;
username = pietje;
};
}
Optional({
"-KeJWO0V9kxgGnrACAtP" = {
PictureVersion = 2;
readyToGo = 0;
userID = SZlQ76RLCJQpFa0CDhrgFJoYzrs2;
username = pietje;
};
})
これは印刷されるので、userIDは与えられません。どうしてこれなの?ユーザーIDはすぐそこです!私は、ドキュメントを読んで、それは動作するはずです...
で
chatVc.channelRef = channelRef.child(channel.id)
を交換してみてください、あなたは 'channelRef?'変数を設定する行を含めることはできますか? –'' some_collection/an_object "の代わりに' 'some_collection/an_object/readyToGo''のようなデータベース構造に深く入り込むパスを' 'snapshot'が返される理由を説明するパスを与えている可能性があります辞書の代わりに文字列 –
私は質問を編集しました。私が思うようにデータを辞書に変更するときに何かが間違っている – Petravd1994