ios - 将 Firebase 数据合并到 TableView 中

标签 ios uitableview firebase swift3 firebase-realtime-database

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

Photo of All users

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

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

在上面的照片中,您可以看到目前有 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()

    })
}



}

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

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

Screenshot

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

最佳答案

一切看起来都不错,但是您应该做的不是将数据添加到结构中(如果它已经存在),因此您需要做的是修复 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 语句中,它将确定用户是否已经 checkin ,然后将其添加到结构中(如果尚未 checkin )。

关于ios - 将 Firebase 数据合并到 TableView 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42756135/

相关文章:

ios - 在手机上自动完成 - AS3

iphone - UITableView 的滚动背景图像?

ios - 当我回来时,TableView 显示相同的数据两次或更多次?

android - Android项目中的C++ Firebase链接错误

ios - APNS 推送通知,loc-args 中的字符串键

ios - CATextLayer 上来自 iOS 6 的不需要的垂直填充

database - 该文档不存在,不会出现在查询或快照中,但结构相同的文档有效

javascript - 使用 Firebase 身份验证时为 "This domain is not authorized"

jquery animate scrollTop 和 scrollLeft 不能同时在 ipad 上工作

ios - 将数据从 TableViewController 传递到 TableViewCell