我目前正在使用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变量只是一个时间戳,我有十条记录(1-10,其中10是最新的,1是最旧的).使用我现在拥有的代码,tableVIEw以升序视图显示数据,从5开始到10结束.
我试图通过在loadValues函数中附加dict之前简单地执行.reverse()来反转字典数组(post).因为我只想让它在顶部显示10,在底部显示5.
我遇到的第二个问题是,我似乎无法找到更新tableVIEw(添加另外5条记录)的有效方法.我试图简单地只有一个默认值为5的全局变量,然后在loadMore上加上5,然后在dict和posts上做一个removeAll() – 没有运气(tableVIEw滚动到顶部,我不想).我也尝试使用querylimitedTolast和querylimitedToFirst,我最终复制了一些数据.
换句话说,我还需要确定用户实际上可以加载5个新的唯一帖子(或者例如3,如果只剩下3个唯一帖子).
有没有人对我如何处理这个问题有任何想法?
非常感谢帮助,因为我过去两天一直在努力解决这个问题.
如果您使用tableVIEw更新您的DataSource而不是在特定索引处添加行.使用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节点中的子节点数并将其递增1来完成.或者创建完整的单独节点
noOfposts: 100,//Lets say there are 100 posts in your DB posts : { Post1:{ text : asdasdasd,index : 12 },Post2:{ text : asdasddasdasd,index : 13 },..... }
您的最终代码将如下所示: –
import UIKitimport Firebaseclass 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({.index_Initial > .index_Initial}) if self.datafeed.count == initialFeedCount+5{ self.datafeed.sortInPlace({.index_Initial > .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({.index_Initial > .index_Initial}) if self.datafeed.count == initialFeedCount+4{ self.datafeed.sortInPlace({.index_Initial > .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 }}总结
以上是内存溢出为你收集整理的swift – 一次仅检索5个用户:Firebase [如Instagram]全部内容,希望文章能够帮你解决swift – 一次仅检索5个用户:Firebase [如Instagram]所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)