Firebase如何在swift中实现具有多个图像的帖子功能

问题描述 投票:0回答:2

我想实现像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上?

另外,在集合视图上显示多个图像时,如何配置单元格?我实现了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()
        }

    }

先感谢您!

ios swift firebase
2个回答
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中的每个单元格,您可以使用post的images数组中的相应URL进行配置。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.