将 Firebase 数据合并到表视图中

Posted

技术标签:

【中文标题】将 Firebase 数据合并到表视图中【英文标题】:Merging Firebase Data into Table View 【发布时间】:2017-03-13 03:20:26 【问题描述】:

首先,我在 Firebase 中存储了 2 组数据。我会将这两组都包含在一张照片中。

第一张照片显示了我保存所有用户个人资料的位置。

当有人在应用程序上签到时,我会将他们的用户名和签到时间存储在不同的地方。

在上面的照片中,您将能够看到当前有 2 个用户在“12-3-2017 Block 2”签到

我存储数据没有问题。

但是我在显示数据时确实遇到了问题。

我希望能够创建一个 UITableView 来显示所有已签入的用户以及他们签入的时间,而在同一个列表中显示所有尚未签入的用户。

import UIKit
import Firebase

 struct checkInStruct 

let userName : String!
let hour : String!
let minutes : String!
let userNameFromAllUsers : String!

 


class checkInDaysTableViewController: UITableViewController 


//Variables
var lastChildNameSegue = ""


var posts = [checkInStruct]()
let user = FIRAuth.auth()?.currentUser

override func viewDidLoad() 
    super.viewDidLoad()

    self.navigationItem.title = "\(lastChildNameSegue)"


    print("Name of Child After Segue -> \(lastChildNameSegue)")


    loadCheckedInUsers()
    loadAllUsers()

    print(posts)




override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return posts.count


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")

    let userName = posts[indexPath.row].userName
    let hour = posts[indexPath.row].hour
    var minute = posts[indexPath.row].minutes
    let userNameOfAllUsers = posts[indexPath.row].userNameFromAllUsers

    let label1 = cell?.viewWithTag(1) as! UILabel
    let label2 = cell?.viewWithTag(2) as! UILabel


    if(hour == nil || hour == "")
        //Users isnt signed in
        label1.text = "\(userName!)"
        label2.text = "User Not checked in"
    else
        label1.text = "\(userName!)"
        label2.text = "\(hour!):\(minute!)"
    


    return cell!


func loadCheckedInUsers ()

    let databaseRef = FIRDatabase.database().reference()

    let userID = user?.uid

    databaseRef.child("users").child("\(userID!)").child("checkins").child("\(lastChildNameSegue)").queryOrderedByKey().observe(.childAdded, with:  (snapshot) in


        let userNameSnapValue = snapshot.value as? NSDictionary
        let userName = userNameSnapValue?["userName"] as? String


        let hourSnapValue = snapshot.value as? NSDictionary
        let hour = hourSnapValue?["hour"] as? String

        let minutesValue = snapshot.value as? NSDictionary
        let minutes = minutesValue?["minutes"] as? String

        print(userName!)
        print(hour!)
        print(minutes!)

        self.posts.insert(checkInStruct(userName: userName, hour: hour, minutes: minutes, userNameFromAllUsers: userName) , at: 0)
        self.tableView.reloadData()


    )


func loadAllUsers()

    let databaseRef = FIRDatabase.database().reference()

    let userID = user?.uid

    databaseRef.child("users").child("\(userID!)").child("employeesorstudents").queryOrderedByKey().observe(.childAdded, with:  (snapshot) in


        let userNameSnapValue = snapshot.value as? NSDictionary
        let userName = userNameSnapValue?["userName"] as? String

        let hour = ""
        let minutes = ""

        print(userName!)

        self.posts.insert(checkInStruct(userName: userName, hour: hour, minutes: minutes, userNameFromAllUsers: userName) , at: 0)
        self.tableView.reloadData()

    )





如您所见,我将数据存储在一个结构中。

但是,在应用程序上,它同时显示了所有用户数据库中的用户名和签入用户。

在屏幕截图中,您会看到“Brandon Happy”有一个签入时间,然后他再次出现,说他从未签入过。如何从结构中删除重复的数据?

【问题讨论】:

【参考方案1】:

一切看起来都不错,但是如果结构已经存在,您应该做的是不要将数据添加到结构中,因此您需要做的是修复您的 loadAllUsers() 函数。

func loadAllUsers()

    let databaseRef = FIRDatabase.database().reference()

    let userID = user?.uid

    databaseRef.child("users").child("\(userID!)").child("employeesorstudents").queryOrderedByKey().observe(.childAdded, with:  (snapshot) in


        let userNameSnapValue = snapshot.value as? NSDictionary
        let userName = userNameSnapValue?["userName"] as? String

        let hour = ""
        let minutes = ""

        print(userName!)

        databaseRef.child("users").child("\(userID!)").child("checkins").child("\(self.lastChildNameSegue)").observeSingleEvent(of: .value, with:  (snapshot) in

            if snapshot.hasChild("\(userName!)")
                print("User already checked in")
            else
                print("user has not yet checked in")
                self.posts.insert(checkInStruct(userName: userName, hour: hour, minutes: minutes, userNameFromAllUsers: userName) , at: 0)
                self.tableView.reloadData()

            

        )




    )

在 if 语句中,它会判断用户是否已签入,如果尚未签入,则将其添加到结构中。

【讨论】:

以上是关于将 Firebase 数据合并到表视图中的主要内容,如果未能解决你的问题,请参考以下文章

将数据从集合视图传递到表视图

如何将数据从集合视图传递到表视图类?

如何使用 Alamofire 和 SwiftyJSON 将数据发送到表视图

如何将 Json 数据发送到表视图数组?迅速

将嵌套的 JSON 数据列出到表视图

当我将核心数据添加到表视图时,我的应用程序崩溃了