Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift Firebase TableView数据-DataEventType.value_Ios_Swift_Firebase_Firebase Realtime Database - Fatal编程技术网

Ios Swift Firebase TableView数据-DataEventType.value

Ios Swift Firebase TableView数据-DataEventType.value,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我正在调用一个“following”子用户,并查看登录用户的UID是否存在,以及是否有另一个用户的子用户,该登录用户正在跟踪该子用户 我正在将登录用户正在跟踪的用户打印到tableview中。第一个问题是我的代码,因为我知道在彼此之间有两个firebase调用是不好的做法,所以我需要有人教我一个更好的方法。由于糟糕的代码,当我解开另一个用户的追踪,回到显示他们正在追踪的登录用户列表的选项卡时,它会显示以下内容(下图)。当登录用户没有跟踪任何人时,它应该只显示“对不起!”文本,但仍然保留用户跟踪的

我正在调用一个“following”子用户,并查看登录用户的UID是否存在,以及是否有另一个用户的子用户,该登录用户正在跟踪该子用户


我正在将登录用户正在跟踪的用户打印到tableview中。第一个问题是我的代码,因为我知道在彼此之间有两个firebase调用是不好的做法,所以我需要有人教我一个更好的方法。由于糟糕的代码,当我解开另一个用户的追踪,回到显示他们正在追踪的登录用户列表的选项卡时,它会显示以下内容(下图)。当登录用户没有跟踪任何人时,它应该只显示“对不起!”文本,但仍然保留用户跟踪的人。需要有人教我一个更好的方法来做这种类型的firebase调用。下面是代码和firebase JSON堆栈映像。。。在firebase JSON堆栈映像中,扩展的UID是登录用户,子用户是登录用户跟随的另一个用户。我需要一个更好的方法来调用和提取这些信息,我只是不知道如何操作


弄明白了,只需要像我以前在其他订阅源上那样做

import UIKit
import Firebase

class BusinessFollowing: UITableViewController {

@IBOutlet var noDataView: UIView!
@IBOutlet var followingTableView: UITableView!

var yourFollowing = [Information]()

var listFollowing = [NSDictionary?]()
var databaseRef = Database.database().reference()
let uid = Auth.auth().currentUser?.uid


var loggedInUser = Auth.auth().currentUser
var loggedInUserData:NSDictionary?

var following = [String]()

override func viewDidLoad() {
    super.viewDidLoad()

    self.followingTableView.backgroundView = nil


}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    self.followingTableView.reloadData()
    self.yourFollowing.removeAll()
    self.following.removeAll()

    getFollowingData()

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    super.prepare(for: segue, sender: sender)
    if segue.identifier == "following" {
        // gotta check if we're currently searching
            if let indexPath = followingTableView.indexPathForSelectedRow {
                let user = listFollowing[indexPath.row]
                let controller = segue.destination as? ExploreBusinessProfileSwitchView
                controller?.otherUser = user
            }
    }
}

override func numberOfSections(in tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return self.yourFollowing.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! BusinessFollowingCell
    let following = yourFollowing[indexPath.row]

    let businessName = following.businessName
    let businessStreet = following.businessStreet
    let businessCity = following.businessCity
    let businessState = following.businessState

    cell.businessName.text = businessName
    cell.businessStreet.text = businessStreet
    cell.businessCity.text = businessCity
    cell.businessState.text = businessState

    // cell.businessName?.text = self.listFollowing[indexPath.row]?["businessName"] as? String
    // cell.businessStreet?.text = self.listFollowing[indexPath.row]?["businessStreet"] as? String
    // cell.businessCity?.text = self.listFollowing[indexPath.row]?["businessCity"] as? String
    // cell.businessState?.text = self.listFollowing[indexPath.row]?["businessState"] as? String

    return cell
}

func getFollowingData() {
    self.yourFollowing.removeAll()
    self.following.removeAll()
    self.followingTableView.reloadData()

    Database.database().reference().child("Businesses").child((loggedInUser?.uid)!).child("following").observe(.value, with: { snapshot in
        if snapshot.exists() {
            MBProgressHUD.showAdded(to: self.view, animated: true)
            let databaseRef = Database.database().reference()
            databaseRef.child("Businesses").queryOrderedByKey().observeSingleEvent(of: .value, with: { (usersSnapshot) in
                let users = usersSnapshot.value as! [String: AnyObject]
                for (_, value) in users {
                    if let userID = value["uid"] as? String {
                        if userID == Auth.auth().currentUser?.uid {
                            print(value)
                            if let followingUsers = value["following"] as? [String : String] {
                                for (_,user) in followingUsers {
                                    self.following.append(user)
                                }
                            }
                            databaseRef.child("following").queryOrderedByKey().observeSingleEvent(of: .value, with: { (postsSnapshot) in
                                let posts = postsSnapshot.value as! [String: AnyObject]

                                for (_, post) in posts {
                                    for (_, postInfo) in post as! [String: AnyObject] {
                                        if let followingID = postInfo["uid"] as? String {
                                            for each in self.following {
                                                if each == followingID {
                                                    guard let uid = postInfo["uid"] as! String? else {return}
                                                    guard let name = postInfo["businessName"] as! String? else {return}
                                                    guard let address = postInfo["businessStreet"] as! String? else {return}
                                                    guard let state = postInfo["businessState"] as! String? else {return}
                                                    guard let city = postInfo["businessCity"] as! String? else {return}

                                                    self.yourFollowing.append(Information(uid: uid, businessName: name, businessStreet: address, businessCity: city, businessState: state))
                                                }

                                                self.followingTableView.backgroundView = nil
                                                self.followingTableView.reloadData()
                                            }
                                        }
                                    }
                                }
                                MBProgressHUD.hide(for: self.view, animated: true)
                            }) { (error) in
                                print(error.localizedDescription)
                            }
                        }
                    }
                }

            })
        } else {
            print("Not following anyone")
            self.followingTableView.backgroundView = self.noDataView
            MBProgressHUD.hide(for: self.view, animated: true)
        }
    })

}

}

“在彼此之间有两个firebase呼叫是一种不好的做法”你为什么认为这是一种不好的做法?我不是说这不是顺便说一句,但我想在接受它作为一个笼统的声明之前先看看原因。我刚刚被告知,但他们可能是错的,给了我不好的信息。所以在这种情况下,让我们关注代码。当您运行共享的代码段时,该代码有什么问题?问题是,在用户离开并释放某人使tableview为空并显示backgroundView后,tableview需要重新加载。目前,它与我发布的图片类似,但当我返回并再次跟踪并返回到以下列表时,现在有重复的用户单元格,我尝试过执行.removeAll和viewwills,但都没有工作。
import UIKit
import Firebase

class BusinessFollowing: UITableViewController {

@IBOutlet var noDataView: UIView!
@IBOutlet var followingTableView: UITableView!

var yourFollowing = [Information]()

var listFollowing = [NSDictionary?]()
var databaseRef = Database.database().reference()
let uid = Auth.auth().currentUser?.uid


var loggedInUser = Auth.auth().currentUser
var loggedInUserData:NSDictionary?

var following = [String]()

override func viewDidLoad() {
    super.viewDidLoad()

    self.followingTableView.backgroundView = nil


}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    self.followingTableView.reloadData()
    self.yourFollowing.removeAll()
    self.following.removeAll()

    getFollowingData()

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    super.prepare(for: segue, sender: sender)
    if segue.identifier == "following" {
        // gotta check if we're currently searching
            if let indexPath = followingTableView.indexPathForSelectedRow {
                let user = listFollowing[indexPath.row]
                let controller = segue.destination as? ExploreBusinessProfileSwitchView
                controller?.otherUser = user
            }
    }
}

override func numberOfSections(in tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return self.yourFollowing.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! BusinessFollowingCell
    let following = yourFollowing[indexPath.row]

    let businessName = following.businessName
    let businessStreet = following.businessStreet
    let businessCity = following.businessCity
    let businessState = following.businessState

    cell.businessName.text = businessName
    cell.businessStreet.text = businessStreet
    cell.businessCity.text = businessCity
    cell.businessState.text = businessState

    // cell.businessName?.text = self.listFollowing[indexPath.row]?["businessName"] as? String
    // cell.businessStreet?.text = self.listFollowing[indexPath.row]?["businessStreet"] as? String
    // cell.businessCity?.text = self.listFollowing[indexPath.row]?["businessCity"] as? String
    // cell.businessState?.text = self.listFollowing[indexPath.row]?["businessState"] as? String

    return cell
}

func getFollowingData() {
    self.yourFollowing.removeAll()
    self.following.removeAll()
    self.followingTableView.reloadData()

    Database.database().reference().child("Businesses").child((loggedInUser?.uid)!).child("following").observe(.value, with: { snapshot in
        if snapshot.exists() {
            MBProgressHUD.showAdded(to: self.view, animated: true)
            let databaseRef = Database.database().reference()
            databaseRef.child("Businesses").queryOrderedByKey().observeSingleEvent(of: .value, with: { (usersSnapshot) in
                let users = usersSnapshot.value as! [String: AnyObject]
                for (_, value) in users {
                    if let userID = value["uid"] as? String {
                        if userID == Auth.auth().currentUser?.uid {
                            print(value)
                            if let followingUsers = value["following"] as? [String : String] {
                                for (_,user) in followingUsers {
                                    self.following.append(user)
                                }
                            }
                            databaseRef.child("following").queryOrderedByKey().observeSingleEvent(of: .value, with: { (postsSnapshot) in
                                let posts = postsSnapshot.value as! [String: AnyObject]

                                for (_, post) in posts {
                                    for (_, postInfo) in post as! [String: AnyObject] {
                                        if let followingID = postInfo["uid"] as? String {
                                            for each in self.following {
                                                if each == followingID {
                                                    guard let uid = postInfo["uid"] as! String? else {return}
                                                    guard let name = postInfo["businessName"] as! String? else {return}
                                                    guard let address = postInfo["businessStreet"] as! String? else {return}
                                                    guard let state = postInfo["businessState"] as! String? else {return}
                                                    guard let city = postInfo["businessCity"] as! String? else {return}

                                                    self.yourFollowing.append(Information(uid: uid, businessName: name, businessStreet: address, businessCity: city, businessState: state))
                                                }

                                                self.followingTableView.backgroundView = nil
                                                self.followingTableView.reloadData()
                                            }
                                        }
                                    }
                                }
                                MBProgressHUD.hide(for: self.view, animated: true)
                            }) { (error) in
                                print(error.localizedDescription)
                            }
                        }
                    }
                }

            })
        } else {
            print("Not following anyone")
            self.followingTableView.backgroundView = self.noDataView
            MBProgressHUD.hide(for: self.view, animated: true)
        }
    })

}

}