一次只能检索5个用户:Firebase[像Instagram]



在过去的几天里,我一直在尝试为我的应用程序创建一个类似instagram的feed。更具体地说:每次用户从底部更新feed时加载新帖子(5)。

我目前正在使用Firebase来存储和显示我的数据。

到目前为止,我的代码是这样的:
    var ref:FIRDatabaseReference!
    var dict = [String:Any]()
    var posts = [[String:Any]]()
   override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
        ref = FIRDatabase.database().reference()
        // Do any additional setup after loading the view, typically from a nib.
    }
    override func viewDidAppear(animated: Bool) {
        loadValues()
    }
    func loadValues() {
        dict.removeAll()
        posts.removeAll()

        ref.child("posts").queryOrderedByChild("timeCreated").queryLimitedToLast(5).observeEventType(.ChildAdded) { (snapshot:FIRDataSnapshot) in
            if let timeCreated = snapshot.value!["timeCreated"] as? Int {
                self.dict["timeCreated"] = timeCreated
            }
            if let postText = snapshot.value!["postText"] as? String {
                self.dict["postText"] = postText
            }

            self.posts.append(self.dict)

            self.tableView.reloadData()
        }


    }

    func scrollViewDidScroll(scrollView: UIScrollView) {
        if (scrollView.contentOffset.y + scrollView.frame.size.height) >= scrollView.contentSize.height {
            //tableView.tableFooterView!.hidden = true
            let pagingSpinner = UIActivityIndicatorView(activityIndicatorStyle: .Gray)
            pagingSpinner.startAnimating()
            pagingSpinner.hidesWhenStopped = true
            pagingSpinner.sizeToFit()
            tableView.tableFooterView = pagingSpinner
            //loadMore(5)
        } else {
            let pagingSpinner = UIActivityIndicatorView(activityIndicatorStyle: .Gray)
            pagingSpinner.stopAnimating()
            pagingSpinner.hidesWhenStopped = true
            pagingSpinner.sizeToFit()
            pagingSpinner.hidden = true
            tableView.tableFooterView = pagingSpinner
            tableView.tableFooterView?.hidden = true

        }

    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return posts.count
    }
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
        if let postText = posts[indexPath.row]["postText"] as? String {
            cell.textLabel!.text = postText
        }
        return cell
    }
    func loadMore(increment:Int) {
        //What should go in here?
    }

所以我在这里要做的是,我正在检测当用户滚动到底部(在我的scrollViewDidScroll函数。然后我简单地显示活动指示器,并调用函数loadMore(5),其中5是我想要显示的新帖子的数量。

这里有两个问题。timeCreated变量只是一个时间戳,其中我有10条记录(1-10,其中10是最新的,1是最旧的)。有了这段代码,tableView以升序视图显示数据,从5开始,到10结束。

我试图通过在loadValues函数中附加字典之前简单地执行.reverse()来反转字典数组(post)。因为我只想让它在顶部显示10,在底部显示5。

我的第二个问题是,我似乎真的找不到一个好的和有效的方式来更新tableView(添加另外5条记录)。我试图简单地只是有一个全局变量的默认值为5,然后在loadMore简单地加上它的5,然后做一个removeAll()上的字典和帖子-没有运气(tableView滚动到顶部,我不想)。我还尝试了queryLimitedTolast和queryLimitedToFirst,在那里我最终复制了一些数据。

换句话说,我还需要检查用户实际上可以加载5个新的唯一帖子(或者,如果只剩下3个唯一帖子,则为3)。

有人知道我该怎么做吗?

如果您能帮助我,我将不胜感激,因为我已经为此挣扎了两天了。

如果您正在使用tableView更新您的数据源而不是在特定索引添加一行。使用struct是一种常用的方法。

struct dataS {
var postData : String!
var index_Initial : Int!
init(post : String!, ind : Int!)
{
 self.postData = post
 self.index_Initial = ind
  }
}
  • 声明类型为 dataSourceS

    的数组
         var dataFeed= [dataS]()
    
  • 为了知道您已经检索了多少帖子,您需要在post节点本身中保留每个帖子的索引。这可以通过计算post节点中的子节点数量并将其加1来实现。或者创建一个完全独立的

    节点
    noOfPosts: 100, //Lets say there are 100 posts in your DB 
     Posts : {
      Post1:{
    
         text : asdasdasd,
         index : 12               
          },
       Post2:{
    
         text : asdasddasdasd,
         index : 13              
          },.....
     }
    

你的最终代码看起来像这样:-

 import UIKit
import Firebase
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
var dataFeed = [dataS]()
let pagingSpinner = UIActivityIndicatorView(activityIndicatorStyle: .Gray)
var totalNoOfPost : Int!

@IBOutlet weak var customTableView: UITableView!


override func viewDidLoad() {
    super.viewDidLoad()
    customTableView.delegate = self
    customTableView.dataSource = self
}
override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    FIRDatabase.database().reference().child("Posts").observeSingleEventOfType(.Value, withBlock: {(snap) in
        if let postDict = snap.value as? [String:AnyObject]{
             self.totalNoOfPost = postDict.count
                self.loadMore()
        }
    })
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return dataFeed.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = customTableView.dequeueReusableCellWithIdentifier("customCell") as! customTableViewCell
    if dataFeed.count > 0{
    cell.poatLabel.text = dataFeed[indexPath.row].postData
    }
    return cell
}
func loadMore(){
    let initialFeedCount : Int = dataFeed.count
    if totalNoOfPost - initialFeedCount - 4 > 0{
    FIRDatabase.database().reference().child("Posts").queryOrderedByChild("index").queryStartingAtValue(totalNoOfPost - initialFeedCount - 4).queryEndingAtValue(totalNoOfPost - initialFeedCount).observeEventType(.Value, withBlock: {(recievedSnap) in
        if recievedSnap.exists(){
        for each in recievedSnap.value as! [String:AnyObject]{
            let temp = dataS.init(post: each.1["text"] as! String, ind : each.1["index"] as! Int)
            self.dataFeed.insert(temp, atIndex: 5 * Int(self.dataFeed.count/5))
            self.dataFeed.sortInPlace({$0.index_Initial > $1.index_Initial})
               if self.dataFeed.count == initialFeedCount+5{
                self.dataFeed.sortInPlace({$0.index_Initial > $1.index_Initial})
                self.customTableView.reloadData()
            }
          }
         }
        }, withCancelBlock: {(err) in
            print(err.localizedDescription)

      })
    }else if totalNoOfPost - initialFeedCount - 4 <= 0{

        FIRDatabase.database().reference().child("Posts").queryOrderedByChild("index").queryStartingAtValue(0).queryEndingAtValue(totalNoOfPost - initialFeedCount).observeEventType(.Value, withBlock: {(recievedSnap) in
            if recievedSnap.exists(){
            for each in recievedSnap.value as! [String:AnyObject]{
                let temp = dataS.init(post: each.1["text"] as! String, ind : each.1["index"] as! Int)
                self.dataFeed.insert(temp, atIndex: 5 * Int(self.dataFeed.count/5))
                self.dataFeed.sortInPlace({$0.index_Initial > $1.index_Initial})
                if self.dataFeed.count == initialFeedCount+4{
                   self.dataFeed.sortInPlace({$0.index_Initial > $1.index_Initial})
                    self.customTableView.reloadData()
                        self.pagingSpinner.stopAnimating()
                }
              }
            }else{
            self.pagingSpinner.stopAnimating()
            }
            }, withCancelBlock: {(err) in
                print(err.localizedDescription)

        })
    }
}
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    if (indexPath.row + 1) == dataFeed.count {
        print("Displayed the last row!")

                    pagingSpinner.startAnimating()
                    pagingSpinner.hidesWhenStopped = true
                    pagingSpinner.sizeToFit()
                    customTableView.tableFooterView = pagingSpinner
                    loadMore()
    }
}

}

struct dataS {
var postData : String!
var index_Initial : Int!
init(post : String!, ind : Int!)
{
 self.postData = post
 self.index_Initial = ind
  }
}

相关内容

  • 没有找到相关文章

最新更新