Nouveau Firebase récupérer les données et les mettre sur la tableView (Swift)
J'ai fait un simple média social avec de nouvelles Firebase, et j'ai réussi à sauver de la chaîne avec la base de données et de l'image avec le stockage, mais quand il s'agit de récupérer des données à la tableView choses inhabituelles se produisent!
toutes les images de récupérer de manière aléatoire de se montrer et de continuellement changer, mais l'autre partie montre parfaitement ou quand j'ai de retour sur les postes.le comte tableView montre pas de poste.
Espère que quelqu'un peut me fournir quelques suggestions
import UIKit
import Firebase
import FirebaseStorage
class timelineTableViewController: UITableViewController {
var posts = [Post]()
var databaseRef: FIRDatabaseReference!
var storageRef: FIRStorageReference!
override func viewDidLoad() {
super.viewDidLoad()
databaseRef = FIRDatabase.database().reference()
storageRef = FIRStorage.storage().reference()
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
//#warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
//#warning Incomplete implementation, return the number of rows
return posts.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cellIdentifier = "postCell"
let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath)as! timelineTableViewCell
let userPostRef = self.databaseRef.child("posts")
userPostRef.observeEventType(.ChildAdded, withBlock: {(snapshot) in
if let postAdd = snapshot.value as? NSDictionary{
let myPost = Post(data: postAdd)
self.posts.insert(myPost, atIndex:0)
cell.usernameLabel.text = self.posts[indexPath.row].username
cell.postText.text = self.posts[indexPath.row].postText
cell.timeLabel.text = self.posts[indexPath.row].time
let url = snapshot.value?["postPhoto"] as! String
let userPhotoUrl = snapshot.value?["userPhoto"] as! String
FIRStorage.storage().referenceForURL(url).dataWithMaxSize(10 * 1024 * 1024, completion: { (data, error) in
let postPhoto = UIImage(data: data!)
cell.postPhoto.image = postPhoto
FIRStorage.storage().referenceForURL(userPhotoUrl).dataWithMaxSize(10 * 1024 * 1024, completion: { (data, error) in
let userPhoto = UIImage(data: data!)
cell.userPhoto.image = userPhoto
})
})
}
})
return cell
}
}
vous souhaitez mettre à jour la question avec des structures ou tableviewcell ou quelque chose de supplémentaire à ce projet? et vous s'il vous plaît prendre des capture d'écran de la vue-contrôleur
OriginalL'auteur Johnny Hsieh | 2016-06-18
Vous devez vous connecter pour publier un commentaire.
La meilleure pratique ici pour remplir votre tableView de données (messages array) dans votre méthode ViewDidLoad. Ensuite, votre tableView n'est pas en essayant de tirer vers le bas les données comme il est rafraîchissant.
Aussi, puisque vous êtes l'ajout d'un .childAdded observateur de votre application sera avisé de firebase donc quand ça arrive, il suffit d'ajouter de nouvelles données pour les postes de tableau et d'actualisation de la tableView.
Il n'y a pas de raison de continuellement extraire des données à partir de Firebase comme il est statique jusqu'à ce qu'elle change. Pour charger une fois et puis d'attendre pour ces changements, vous pouvez envisager d'ajouter un .childChanged de l'événement (et retiré) dans le cas où quelqu'un met à jour leur pic par exemple.
La Firechat application de Firebase est une grande ressource pour la compréhension de la meilleure façon de le faire - si vous suivez que le modèle de conception, vous pouvez éviter tous les problèmes de réseau et ne pas avoir à vous soucier de séparer les appels asynchrones.
Vous pouvez simplement compter sur Firebase pour prendre soin de lui-même.
Modifier... Bien, alors que c'est une Firechat lien, l'Obj-C code semble être manquant (merci Firebase. pouah)
Donc - à la lumière de cela, voir ma réponse à cette question comme il a modèle pour le code dont vous avez besoin.
merci!!!! Im encore un swift débutant, la méthode de tri vraiment faire de ma une grande aide , mais je n'arrive toujours pas à résoudre des problème d'image et des postes.le comte de tableView numberOfRowsInSection ne peut pas montrer toutes les annonces sur tableView, avez-vous la moindre idée, appréciez-vous les gars! merci pour la réponse!
La méthode de tri dans ma réponse était que la moitié de la réponse. Vous aurez besoin de déplacer votre Firebase code de la méthode viewDidLoad et ensuite de le modifier pour être plus comme le code dans mon exemple, au début, de charger les données et d'observer les évolutions futures. Une fois cela fait, vous tableau sera rempli et votre tableView cellForRowAtIndexPath pouvez remplir la cellule de la matrice. Faire ces changements et à moins de mettre le tableau à la charge. Si vous avez un autre problème, de poster une question distincte avec le code mis à jour.
Merci!!!! @Jay vous êtes si bon! Merci pour ur d'instructions claires, je ne sais d'où et de quoi réparer. Ur réponse me faire une grande aide!
grâce à vous, j'ai déjà fini ce projet, ce tutoriel encore une erreur dans swift. Et je ne peux pas comprendre pleinement tous. Je vais continuer à apprendre à ce sujet. Merci pour ur répondre.
OriginalL'auteur Jay
Vous rencontrez des problèmes de Threading.
À partir de l'apple docs:
Dans votre code, vous l'extraction de vos données de manière asynchrone, ce qui pourrait le récupérer sur un autre thread que le thread principal, pour éviter cela, vous pouvez placer le code où vous définissez votre INTERFACE utilisateur dans un
dispatch_async
bloc comme suit:Veuillez noter que le mixage de votre code de mise en réseau et le code de l'INTERFACE utilisateur, comme ce n'est pas nescessarily la meilleure chose à faire. Ce que vous pourriez faire est d'avoir une fonction de la charge /montres-votre point de terminaison, puis l'ajoute à un tableau, puis d'appeler
tableView.reloadData()
et mettre à jour les points de vue.Si vous voulez en savoir un peu plus sur le filetage et le PGCD, regarde cette La WWDC session
Pas de problème @JohnnyHsieh, content que ça a aidé
Comme pour info, tous les rappels sont soulevées sur le thread principal, sauf si vous spécifiez une alternative via
FIRStorage.storage().setCallbackQueue()
(firebase.google.com/docs/reference/ios/firebasestorage/...) la question est probable que la cellule est renvoyé devant la photo a fini le téléchargement, et donc ne s'affiche pas.Je l'ai mise à jour mon code pour déplacer la firebase code de viewDidLoad, le texte de pièces de poste sont en cours, mais ne peut toujours pas mis la photo de dos, j'ai l'aide de l'envoi asynchrone de la méthode, mais toujours en vain, Im supposons maintenant cellule de retour avant que les images a télécharger complètement. Comment dois-je résoudre ce problème?
ne vous question actuelle contenir tout le code liée à votre problème (y compris votre tableView cellule de code)? Si non, pourriez-vous poster et je vais prendre un coup d'oeil
OriginalL'auteur Chris