显示您关注的用户的帖子 - swift

时间:2016-11-18 16:15:14

标签: ios swift uitableview firebase firebase-realtime-database

我制作了以下功能,用户可以互相关注。问题是它没有按照应有的方式使用。在用户撰写帖子时,它将在此引用下保存在我的Firebase数据库中:

FIRDatabase.database().reference().child("feed-items").childByAutoId()

Feed-items是所有帖子的所在。我现在正在更改它,所以当用户发布某些内容时,它将保存在此处:

FIRDatabase.database().reference().child("Users").child(UserID).child("Posts").childByAutoId()

我这样做是因为它以某种方式告诉我,只显示您在我的应用Feed中关注的人的帖子会更容易。

目前我收到了我的Feed的所有帖子(来自Feed-items),如下所示:

func startObersvingDB() {
        FIRDatabase.database().reference().child("feed-items").observeEventType(.Value, withBlock: { (snapshot: FIRDataSnapshot) in
            var newUpdates = [Sweet]()



            for update in snapshot.children {
                let updateObject = Sweet(snapshot: update as! FIRDataSnapshot)
                newUpdates.append(updateObject)

            }

            self.updates = newUpdates.reverse()
            self.tableView.reloadData()


        }) { (error: NSError) in
            print(error.description)
        }
    }

然后我在viewDidLoad中调用startObservingDB()。

如果你想在这里看到我的Sweet结构,那就是:

import Foundation
import FirebaseDatabase
import FirebaseAuth
import UIKit

struct Sweet {
    let key: String!
    let content: String!
    let addedByUser: String!
    let profilePhoto: String!
    let itemRef: FIRDatabaseReference?


    init (content: String, addedByUser: String, profilePhoto: String!, key: String = "") {
        self.key = key
        self.content = content
        self.addedByUser = addedByUser
        self.profilePhoto = profilePhoto
        self.itemRef = nil

    }

    init (snapshot: FIRDataSnapshot) {
        key = snapshot.key
        itemRef = snapshot.ref
        path  = key
        if let theFeedContent = snapshot.value!["content"] as? String {
            content = theFeedContent
        } else {
            content = ""
        }

        if let feedUser = snapshot.value!["addedByUser"] as? String {
            addedByUser = feedUser
        } else {
            addedByUser = ""
        }

        if let feedPhoto = snapshot.value!["profilePhoto"] as? String! {
            profilePhoto = feedPhoto
        } else {
            profilePhoto = ""
        }



    }

    func toAnyObject() -> AnyObject {
        return ["content":content, "addedByUser":addedByUser, "profilePhoto":profilePhoto!]
    }
}

在我的TableViewController中,我使用它在自定义单元格中显示名称等:

var update = updates[indexPath.row]

cell.nameLabel.text = update.addedByUser

等。等

我的问题是: 如何将其更改为仅显示我关注的人的帖子?

对不起,很长的帖子

1 个答案:

答案 0 :(得分:0)

假设您将关注者列表保存为其他父节点中的字典,如下所示: -

user_followed_by :{
  userID2 : {
      userID1 : true,
      userID5 : true,
      userID6 : true,
      userID12 : true,
      userID99 : true, 
     } 
    }

 users :{
  userID2 :{
      post :{
             postAutoID1 : {...},
             postAutoID2 : {...},
             ...
              }
          }   
    }
  postsToShowToUser :{

     userID1 : {
         postAutoID1 : true,  //These are the post's autoID's of all the users whom
                              // your current user is following
         postAutoID5 : true,
         postAutoID3 : true,
     },


   }

/*    // If you choose to declare a separate section of the post Details in your Database.
  posts_Of_The_User :{

    userID1 : {

       postAutoID1 : {...//DETAILS},
       postAutoID2 : {...//DETAILS},
       postAutoID3 : {...//DETAILS},
      ....
           },

     }  */

这个想法是每当您当前用户关注的用户发布帖子时。该帖子的 autoID 会附加在 postsToShowToUser / userID 中。

也就是说,如果 userID2 会发帖,那么系统会调用该帖子的autoID在所有用户 postsToShowToUser / userID 后面跟随 userID2

PS: - 我强烈建议您将帖子详细信息移出post部分。使它成为一个单独的父节点,由多个postAutoID组成,并将数据作为值发布。它可能会在以后派上用场,也可以避免嵌套数据,这可以帮助您浏览数据库。