2017-03-02 70 views
1

これは私の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クリエイター

- 値:なし

更新:

データ構造:

structure

これは今のために働くが、そこより良いアプローチではないでしょうか?

 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はすぐそこです!私は、ドキュメントを読んで、それは動作するはずです...

+0

chatVc.channelRef = channelRef.child(channel.id)を交換してみてください、あなたは 'channelRef?'変数を設定する行を含めることはできますか? –

+0

'' some_collection/an_object "の代わりに' 'some_collection/an_object/readyToGo''のようなデータベース構造に深く入り込むパスを' 'snapshot'が返される理由を説明するパスを与えている可能性があります辞書の代わりに文字列 –

+0

私は質問を編集しました。私が思うようにデータを辞書に変更するときに何かが間違っている – Petravd1994

答えて

0

chatVc.channelRef = channelRef

+0

この方法では、チャンネル内のすべての部屋を観察し、1チャンネルを観察する必要があります。そのチャンネルはchannel.idによって認識されるので、その部分は動作していると思います。 – Petravd1994

+0

私はあなたが何を意味しているのか知っていますが、このようにすべての部屋のすべての人がすべての部屋を観察しています。私はその部屋のすべての人がその部屋だけを観察していることが欲しいと思っています。その辞書の価値があることには何か問題があります。その部屋のチャンネルで地図が変更されている(私はマップが分離しているユーザーがいる)、その値はゼロではありません。 – Petravd1994

+0

質問の最後にデータ構造の例が含まれていますが、Firebaseデータベース内にどのように見えるかを含めることができますか?チャネルchannels/channel-idには、辞書にキャストするために少なくとも1つのキーと値のペアが必要であるため、 –

関連する問題