我想实现像instagram这样的功能,用户可以发布多个图像。我有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
}
}
}
然后我想这样取,以便最新的帖子出现在最上面。但问题是用户每次都不会选择图像。有时,他们只发布一些文字,在这种情况下,应用程序会粉碎。
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)
}
}
我的问题是如何创建最新帖子的功能,如果没有选择图像,只会观察文本和日期并显示在tableviewcell上?
另外,在集合视图中显示多个图像时,如何配置单元格?我实施了文字和日期,但我正在努力处理图片。
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()
}
}
提前谢谢!
答案 0 :(得分:0)
如果您导入Firebase,则无需导入FirebaseDatabase。 但图像应该是(snapshot.value!as!NSDictionary)[“Images”]! [String:String]。您可以使用for循环从该字典中获取值。 我会建议强行解开一切,如果你总是有文字和日期,请使用一个让他们早早逃脱的守卫,以及一个if let for the images。
答案 1 :(得分:0)
这是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
而不是存储参考,则配置单元格以显示图像会更容易。当您将帖子传递给表格视图单元格时,它只需要告诉集合视图它有多少个URL - 然后对于indexPath中的每个单元格,您可以使用帖子的图像数组中的相应URL进行配置。