2017-01-30 5 views
0

У меня есть социальное приложение, у которого есть сообщения, подобные Facebook, но когда я пытаюсь загрузить сообщения, они возвращают нуль.Ошибка при загрузке сообщений из базы данных Firebase (Swift 3)

FIRDatabase.database().reference().child("following").child(FIRAuth.auth()!.currentUser!.uid).queryOrderedByValue().queryEqual(toValue: true).observeSingleEvent(of: .value, with: {(snap) in 
    if let snapDict = snap.value as? [String:AnyObject]{ 
     for each in snapDict{ 


      FIRDatabase.database().reference().child("Posts").child(String(each.key)).queryOrdered(byChild: "timestamp").observeSingleEvent(of: .value, with: {(snapshot) in 

       if (snapshot.value != nil) 
       { 
        self.Posts.append(snapshot.value as! NSDictionary) 


       } 

      }){(error) in 

       print(error.localizedDescription) 
      } 

     } 

    } 

    self.homeTableView.reloadData() 

    self.aivLoading.stopAnimating() 
}) 

после некоторых отладки я свести задачу к этой строке кода, вернуть то ноль значение

FIRDatabase.database().reference().child("Posts").child(String(each.key)).queryOrdered(byChild: "timestamp").observeSingleEvent(of: .value, with: {(snapshot) in 

другая часть моего кода делает вернуть список людей, вы будете следовать и петлями думал, что это.

это структура моей базы данных.

{ 
    "Posts" : { 
    "dEXaVLDOSPfJa3zTyUNqAEtVuMR2" : { 
     "-KbHUnL-RveUQa3MPSWp" : { 
     "latitud" : "21.111401000574", 
     "longitud" : "-89.6112191677094", 
     "text" : "Fiesta en la Anahuac!!! ", 
     "timestamp" : "1485295269.30773", 
     "ubicacionN" : "Universidad Anáhuac Mayab" 
     }, 
     "-KbI1azr6uFel-5uTZOD" : { 
     "latitud" : "Optional(21.018988764483463)", 
     "longitud" : "Optional(-89.614319546492695)", 
     "text" : "Hola chicos", 
     "timestamp" : "1485304393.77929", 
     "ubicacionN" : "Calle 53-A 341" 
     }, 
     "-KbNQWxjQhc0Ce_ZQbq9" : { 
     "latitud" : "Optional(21.019219877217914)", 
     "longitud" : "Optional(-89.614173537203683)", 
     "text" : "Hola", 
     "timestamp" : "1485394812.83039", 
     "ubicacionN" : "Calle 53 341" 
     } 
    }, 
    "mt0fzirhMhazIcy90MRWuRpTfmE2" : { 
     "-KbQOWfUnzY1JiS61J6-" : { 
     "latitud" : "Optional(21.111502615883129)", 
     "longitud" : "Optional(-89.611767497121221)", 
     "text" : "Hola chicos!", 
     "timestamp" : "1485444619.10931", 
     "ubicacionN" : "Carretera Mérida-Progreso 96" 
     } 
    } 
    }, 
    "follower" : { 
    "dEXaVLDOSPfJa3zTyUNqAEtVuMR2" : { 
     "mt0fzirhMhazIcy90MRWuRpTfmE2" : true 
    }, 
    "mt0fzirhMhazIcy90MRWuRpTfmE2" : { 
     "dEXaVLDOSPfJa3zTyUNqAEtVuMR2" : true 
    } 
    }, 
    "following" : { 
    "dEXaVLDOSPfJa3zTyUNqAEtVuMR2" : { 
     "mt0fzirhMhazIcy90MRWuRpTfmE2" : true 
    }, 
    "mt0fzirhMhazIcy90MRWuRpTfmE2" : { 
     "dEXaVLDOSPfJa3zTyUNqAEtVuMR2" : true 
    } 
    }, 
    "handles" : { 
    "jcadmin" : "mt0fzirhMhazIcy90MRWuRpTfmE2", 
    "jcbest" : "dEXaVLDOSPfJa3zTyUNqAEtVuMR2" 
    }, 
    "user_profiles" : { 
    "dEXaVLDOSPfJa3zTyUNqAEtVuMR2" : { 
     "about" : "Hola Mundo", 
     "handle" : "jcbest", 
     "name" : "Juan Carlos Estevez Rodriguez", 
     "profile_pic" : "https://firebasestorage.googleapis.com/v0/b/jalo-267da.appspot.com/o/user_profiles%2FOptional(%22dEXaVLDOSPfJa3zTyUNqAEtVuMR2%22)%2Fprofile_pic?alt=media&token=bfc3c516-7849-472c-b7cd-9668965a5dbe" 
    }, 
    "mt0fzirhMhazIcy90MRWuRpTfmE2" : { 
     "about" : "Hola chicos", 
     "handle" : "jcadmin", 
     "name" : "Juan Carlos", 
     "profile_pic" : "https://firebasestorage.googleapis.com/v0/b/jalo-267da.appspot.com/o/user_profiles%2FOptional(%22mt0fzirhMhazIcy90MRWuRpTfmE2%22)%2Fprofile_pic?alt=media&token=b741b6c1-0bc5-446d-a1e5-159b21e770d2" 
    } 
    } 
} 

это мой весь код. https://www.dropbox.com/sh/u7saz4mdbehw1gd/AACv2rZH7M8jS_lU-plSqwc5a?dl=0

+0

ли 'String (each.key)' вернуть именно то, что вы ищете? Что возвращается, если вы удаляете предложение queryOrderedBy? – Russell

+0

@ Russell да действительно, 'String (each.key)' возвращает UID других пользователей. Я просто попытался удалить queryOrderBy, ничего не происходит. –

+0

Вы используете Disk Persistence? –

ответ

0

Я нашел проблему после того, как много и отладки, как это tourns, проблема в том, что в этой части

FIRDatabase.database().reference().child("Posts").child(String(each.key)).queryOrdered(byChild: "timestamp").observeSingleEvent(of: .value, with: {(snapshot) in 

       if (snapshot.value != nil) 
       { 
        self.Posts.append(snapshot.value as! NSDictionary) 


       } 

      }){(error) in 

       print(error.localizedDescription) 
      } 

й e Query фактически загружал все сообщения, но они содержались в нестационарной varaible (ошибка noob), поэтому единственное, что мне нужно было сделать, это перезагрузить данные сразу после того, как они получили каждое сообщение, то есть нужно было как это:

FIRDatabase.database().reference().child("Jalas").child(each.key).queryOrderedByKey().observe(.childAdded, with: { (snapshot:FIRDataSnapshot) in 

         print(snapshot.value as! NSDictionary) 

         self.Jalas.append(snapshot.value as! NSDictionary) 
         self.homeTableView.reloadData() 
        }) 

поэтому полный код выглядит примерно так:

 self.homeTableView.delegate = self 
     self.homeTableView.dataSource = self 

     self.loggedInUser = FIRAuth.auth()?.currentUser 

     print("LoggedInUser: " + (self.loggedInUser?.uid)!) 


     FIRDatabase.database().reference().child("following").child(FIRAuth.auth()!.currentUser!.uid).queryOrderedByValue().queryEqual(toValue: true).observeSingleEvent(of: .value, with: {(snap) in 

      //if let snapDict = snap.value as? [String:AnyObject]{ 

      let sanpDict = snap.value as? [String:AnyObject] 
      if (sanpDict != nil) 
      { 
       for each in sanpDict!{ 

        print("each.key es: " + String(each.key)) 

        FIRDatabase.database().reference().child("Jalas").child(each.key).queryOrderedByKey().observe(.childAdded, with: { (snapshot:FIRDataSnapshot) in 

         print(snapshot.value as! NSDictionary) 

         self.Jalas.append(snapshot.value as! NSDictionary) 
         self.homeTableView.reloadData() 
        }) 

       } 
     } 


      self.aivLoading.stopAnimating() 
     }) 
0

Если это допустимый набор данных, то вы ищете неправильную вещь в своем запросе, но может быть, что я просто не понимаю ваши данные!

Я предполагаю, что currentUser является dEXaVLDOSPfJa3zTyUNqAEtVuMR2, и что первый запрос, чтобы получить те, следующий должен вернуться mt0fzirhMhazIcy90MRWuRpTfmE2

У вас нет никаких ссылок на mt0fzirhMhazIcy90MRWuRpTfmE2 в должности, так что вы никогда не будете получить что-либо возвращенное во втором запросе ...

+0

ваше право, извините, это обновленная версия моей базы данных. Позвольте мне обновить ее. @Russell –

+0

done @Russell as вы можете видеть, что я делаю, - это запрос людей, которые находятся под следующим и под вашим UID, но только те, кто имеет значение, равны true (это может быть неверно, если пользователь вас отследит), 'each.key' return 'mt0fzirhMhazIcy90MRWuRpTfmE2' я проверяю его с помощью' print (each.key) ' –

+0

cool - я просто обновляю свою версию сейчас ... – Russell