Firebase如何在swift中实现具有多个图像的postfunction

我想实现像instagram这样的function,用户可以发布多个图像。 我有tableviewcell,在tableviewcell上有collectionviewcell来显示图像。

这是我的firebase结构

"Post": { "uid": { "Text": "some text", "Date": "some date", "images": { autoID1: url1, autoID2: url2 } } } 

这是我的模特。 我正确地初始化了吗?

 import Foundation import Firebase import FirebaseDatabase struct Post { var Text: String! var Date: String! var images: String? init(snapshot: FIRDataSnapshot){ for child in snapshot.children{ key = snapshot.key ref = snapshot.ref Text = (snapshot.value! as! NSDictionary)["Text"] as! String Date = (snapshot.value! as! NSDictionary)["Date"] as? String let snap = child as! DataSnapshot images = snap.value as! String } } } 

那么我想这样取,以便最新的post出现在最上面。 但问题是用户不是每次都选择图像。 有时,他们只发布一些文字,在这种情况下,应用程序会粉碎。

 var postsArray = [Post]() func fetchPosts(){ dataBaseRef.child("Post").child(uid!).observe(.value, with: { (snapshot) in var results = [Post]() for post in snapshot.children { let post = Post(snapshot: post as! FIRDataSnapshot) results.append(post) } self.usersArray = results.sorted(by: { (u1, u2) -> Bool in u1.Date > u2.Date }) self.tableView.reloadData() }) { (error) in print(error.localizedDescription) } } 

我的问题是如何创建最新post出现在顶部的function,如果没有选择图像,只观察文本和日期并显示在tableviewcell上?

另外,在集合视图中显示多个图像时,如何配置单元格? 我实现了Text和Date,但我正在努力处理图像。

 func configureCell(post: Post){ self.TextLabel.text = post.Text self.DateLabel.text = post.Date } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "postsCell", for: indexPath) as! PostsTableViewCell cell.configureCell(post: postsArray[indexPath.row]) return cell } //how to configure cell? import UIKit import Firebase class PostCollectionViewCell: UICollectionViewCell { @IBOutlet var imageView: UIImageView! var storageRef: Storage { return Storage.storage() } } 

先谢谢你!

这是Firebase的DataSnapshot (又名FIRDataSnapshot )的扩展,它有助于将快照中的值转换为类的最方便类型。 在日期的特定情况下,我假设您使用Firebase.ServerValue将它们存储为毫秒。

 extension DataSnapshot { func child(_ pathString: String) -> DataSnapshot { return childSnapshot(forPath: pathString) } var snapshots: [DataSnapshot] { return children.allObjects.flatMap({ $0 as? DataSnapshot }) } var date: Date? { return double.flatMap({ $0 / 1000 }) } var double: Double? { return value as? Double } var string: String? { return value as? String } var url: URL? { return string.flatMap({ URL(string: $0) }) } var urls: [URL] { return snapshots.flatMap({ $0.url }) } } 

您现在可以使用快照初始化Post并将属性方便地转换为正确的类型,如果它们不存在则不会崩溃。 这样,在使用数据配置单元格时,您就不用考虑了。

 struct Post { // MARK: Properties let snapshot: DataSnapshot var created: Date! var images: [URL]? var text: String! // MARK: Lifecycle init(snapshot: DataSnapshot) { self.snapshot = snapshot self.created = snapshot.child("created").date self.images = snapshot.child("images").urls self.text = snapshot.child("text").string } } 

如果存储图像的downloadURL而不是存储引用,则配置单元格以显示图像将会容易得多。 当您将post传递给表格视图单元格时,它只需要告诉集合视图它有多少个URL – 然后对于indexPath中的每个单元格,您可以使用post的images数组中的相应URL进行配置。

如果您导入Firebase,则无需导入FirebaseDatabase。 但是图像应该是(snapshot.value!as!NSDictionary)[“Images”]! [String:String]。 您可以使用for循环从该字典中获取值。 我会建议强行打开所有东西,如果你总是有文字和日期,请使用一个让他们早早逃脱的守卫,以及如果让我们为图像。