2017-03-02 4 views
1

이 파일은 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! 
     } 

오류 코드와 함께 추락 :

유형 'NSDictionary에'(0x10a780288)에 '__NSCFString'(0x10a77f4a0)의 값을 캐스팅 할 수 없습니다. "update"라인에서. 이것은 내 첫 번째 시도 :

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 
     } 

이것은 부풀어 오르지 않습니다.

스냅 (창조자) 안녕하세요

인쇄 ("변경된 창조자"가) 실행되지 않을 그러나 : 중포 기지에서 작성자 (단지 문자열)을 변경하는 경우 (스냅 샷) 인쇄를 추가 할 때, 나는 인쇄로이를 얻을 수 . 왜 이런거야?

편집 :

 print("path channel ref: " + "\(self.channelRef)") 
     print("snapshot: " + "\(snapshot)") 
     print("value: " + "\(value)") 

- 경로 채널 심판 : 이것은 내가 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 

} 

인쇄 더 많은 데이터를 가지고 어떻게 선택 (https://X.com/channels/-KeGKaJavH6uPYaSa7k4)

-snapshot : 스냅 (창작자) new 창조자

- 값 : 없음

,451,515,

업데이트 :

데이터 구조 :

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

그리고 이것은 사용자 ID가 주어지지 않으므로 출력된다. 왜 이런거야? 사용자 ID가 바로 있습니다! 당신은`channelRef?`변수를 설정 어디 라인을 포함 할 수 있습니다

+0

chatVc.channelRef = channelRef.child(channel.id)를 교체 시도 ... 나는 문서를 읽을 수 있지만 그것은 작동 하는가? –

+0

''some_collection/an_object ''대신''some_collection/an_object/readyToGo ''처럼 데이터베이스 구조에 너무 깊게 들어가는 경로를''snapshot'이 왜 사전 대신 –

+0

문자열을 편집했습니다. 내가 생각하는 사전에 데이터를 바꿀 때 뭔가 잘못되었습니다. – Petravd1994

답변

0

chatVc.channelRef = channelRef

+0

이 방법은 채널의 모든 싱글 룸을 관찰 할 것이므로 1 채널을 관찰해야합니다. 해당 채널은 channel.id에 의해 인식되므로 해당 부분이 작동하고 있다고 생각합니다. – Petravd1994

+0

나는 네가 무슨 뜻인지 안다. 그러나 모든 방의 모든 사람이 모든 방을 관찰하고있다.그 방에있는 모든 사람이 그 방만 관찰하고 있기를 바랍니다. 그 사전에 가치가있는 것이 잘못되었습니다. 해당 룸 채널에서지도가 변경되면 (분리 된지도가있는 사용자가 있음) 그 값은 0이 아닙니다. – Petravd1994

+0

질문 끝 부분에 데이터 구조의 예가 포함되어 있지만 Firebase 데이터베이스에 보이는 내용을 포함 할 수 있습니까? channels/channel-id 경로는 사전 –

관련 문제