2016-11-18 68 views
3

我已经做了以下功能,用户可以关注对方。问题在于它没有按照应有的方式使用。在当用户写帖子,将这个标记下被保存在我的火力地堡数据库中的时刻:显示你正在关注的用户的帖子 - swift

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

饲料项是所有职位。我改变这不过现在,这样当用户发布的内容将保存在这里:

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

我这样做,是因为它在某种程度上告诉我,会更容易,只显示人的帖子你按照我的应用程序饲料。

在我收到的所有帖子我进(从供项)这样的时刻:

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 

等。等等

我的问题是: 我该如何改变,只显示我所关注的人的帖子?

很抱歉的长期职位

回答

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

    } */ 

的想法是,只要用户为之当前的用户正在关注发帖。该帖子的自动编号获取后附于postsToShowToUser/userID

也就是说,如果userID2将使后则调用将进行追加该职位的自动识别中的所有用户postsToShowToUser /用户ID谁是继userID2

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

+0

我不太清楚我的理解;你是说当用户发布帖子时,它应该检查谁跟随该用户,然后将该帖子添加到所有跟随该用户的用户?:-)是不可能做到这一点的;当一个用户发布一些东西进入他们的个人资料 - 那么所有当前的用户追随者进入一个数组并检查帖子?我真的没有线索,但添加用户帖子多个地方将需要一些空间 - 对吗? –

+0

基本上允许用户访问其他用户配置文件不是一个好主意。阅读我在PS中建议的内容。而不是* postsToShowToUser *中的true,您可以提供发布用户的用户标识。一旦你有帖子的帖子ID和用户ID。现在,您可以在数据库的* post *部分导航postID的帖子详细信息,而不会授予用户访问其他用户帐户的权限。我已经相应地更新了我的答案。 – Dravidian

+0

至于追加每个追随者的postID,你的用户可以只发一个帖子,然后你将不得不遍历每个users_Follwers,然后通过他们的postID,从那里你将能够获得每个最近的帖子postDetails。这不是一个坏主意,但是您会授权随机访问者访问您的其他用户的个人详细信息,并且需要很长时间才能加载所有详细信息并循环播放,您的应用用户可能不希望等待很长时间阅读他们的朋友发布的帖子...! – Dravidian