2017-12-16 4 views
0

私は複数の画像を投稿できるinstagramのような機能を実装したいと思います。私はtableviewcellを持っていて、tableviewcellには、画像を表示するcollectionviewcellがあります。Firebase素早く複数の画像を持つ投稿機能を実装する方法

はここにここに私のモデルであり、私の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 
    } 
    } 
} 

この場合、最新の投稿が上に表示されるようにしたいと思います。問題はユーザーが毎回画像を選択しないことです。時には、テキストを投稿するだけです。その場合、アプリが壊れてしまいます。

私の質問は、最新の投稿が一番上に表示され、画像が選択されなかった場合は、テキストと日付のみが観察され、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() 
     } 

    } 

ありがとうございます!

答えて

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を初期化して、彼らはそこにいないのであれば、クラッシュすることなく、便利正しい型にキャスト特性を有することができます。このようにして、データを使ってセルを構成するときに考えることが少なくなります。あなたが代わりにストレージ参照の画像のdownloadURLを保存する場合は、画像を表示するようにセルを構成する

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 
    } 
} 

ずっと楽になります。ポストをテーブルビューのセルに渡すと、コレクションビューにURLの数を伝えるだけで済みます。次に、indexPathの各セルについて、ポストのimages配列に対応するURLを設定します。

+0

ありがとうございました! – Daibaku

+0

@Callamどこでスナップショットを見つけましたか?チャイルド?そのようなプロパティはドキュメントには表示されません。https://firebase.google.com/docs/reference/swift/firebasedatabase/api/reference/Classes/DataSnapshot#value –

+1

Oopsy、私の間違い - これはカスタム拡張です。 – Callam

0

Firebaseをインポートする場合、FirebaseDatabaseもインポートする必要はありません。 しかし、画像は(snapshot.value!as!NSDictionary)["Images"]として! [String:String] forループを使用して、その辞書から値を取得することができます。 あなたはいつもテキストと日付を持っていれば、すべてのイメージをアンラップすることをお勧めします。

+0

ありがとうございました! – Daibaku

関連する問題