gpt4 book ai didi

ios - Firebase 客户端应用程序

转载 作者:行者123 更新时间:2023-11-30 12:31:16 25 4
gpt4 key购买 nike

我正在为我的一位家庭成员制作一款应用程序,以便他们可以更好地管理他们的客户,但遇到了一些问题。这是我第一次使用 Firebase,我似乎无法让我的代码运行!我陷入困境的部分涉及 Firebase 的实时数据库,我正在 XCode 8.3 和 Swift 3.1 中工作。

代码:

import UIKit
import FirebaseCore
import FirebaseDatabase
import FirebaseAuth

var specClientId = ""

class MyCell: UITableViewCell {

@IBOutlet var nameCell: UILabel!

@IBOutlet var statusCell: UILabel!

}

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

@IBOutlet var tableView: UITableView!

var ref: FIRDatabaseReference!

var tableArray: [String] = []

var clientId: [String] = []

var statusArray:[String] = []

@IBAction func signOut(_ sender: Any) {

UserDefaults.resetStandardUserDefaults()

performSegue(withIdentifier: "segueBackLogin", sender: self)

}

public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

return tableArray.count

}

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

let cell = tableView.dequeueReusableCell(withIdentifier: "CellFront") as! MyCell

cell.nameCell.text = tableArray[indexPath.row]

cell.statusCell.text = statusArray[indexPath.row]

return cell

}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

specClientId = clientId[indexPath.row]

ref.child("Users").child(specClientId).child("lastUpdate").removeValue()

performSegue(withIdentifier: "segue", sender: self)

}

override func viewDidLoad() {
super.viewDidLoad()

if FIRApp.defaultApp() == nil {
FIRApp.configure()
}

ref = FIRDatabase.database().reference()

ref.child("Users").observeSingleEvent(of: .value, with: { (snapshot) in

let value = snapshot.value as? NSDictionary

let specificValues = value?.allKeys

self.tableArray.removeAll()

self.statusArray.removeAll()

self.clientId.removeAll()

var it = 0

for Uservalue in specificValues! {

self.tableArray.append("")

self.statusArray.append("")

self.clientId.append(Uservalue as! String)

self.ref.child("Users")
.child(Uservalue as! String)
.child("name")
.observeSingleEvent(of: .value, with: { (snapshot) in

let nameValue = snapshot.value as? String

self.tableArray.insert(nameValue!, at: it)

self.tableArray = self.tableArray.filter {$0 != ""}

self.tableView.reloadData()

}) { (error) in

print(error.localizedDescription)

}

self.ref.child("Users")
.child(Uservalue as! String)
.child("lastUpdate")
.observeSingleEvent(of: .value, with: { (snapshot) in

if let nameValue = snapshot.value as? String {

self.statusArray.insert("*", at: it)

self.tableView.reloadData()

} else {

self.statusArray.insert("", at: it)

self.tableView.reloadData()

}

}) { (error) in

print(error.localizedDescription)

}

it += 1

}

}) { (error) in

print(error.localizedDescription)

}

}

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


}

我的主要问题是,当我获取用户的名称及其上次更新状态时,数组列表无法正确匹配,并且 TableView 显示有关哪个用户提交了更新的错误信息。为了解决这个问题,我尝试在数组中使用插入方法,但现在应用程序崩溃了。以前,我使用的是append 方法,但这会导致TableView 中显示错误的信息。如果你们中有人能帮助我解决这个问题,我将不胜感激。

注意:由于 StatusArray 的元素数量与 TableArray 的元素数量不同,应用程序崩溃。这是由于 TableArray 有一些没有名称的空元素造成的。

谢谢,关键点

编辑1:

for Uservalue in specificValues! {

self.clientId.append(Uservalue as! String)

let user = User()

self.ref.child("Users")
.child(Uservalue as! String)
.observeSingleEvent(of: .value, with: { (snapshot) in

let nameValue = snapshot.value as? NSDictionary

let specNameValue = nameValue?.allKeys

var i = 0

while i < specNameValue!.count {

if specNameValue?[i] as? String == "name" {

user.name = nameValue?.allValues[i] as! String

} else if specNameValue?[i] as? String == "lastUpdate" {

user.status = "*"

} else if specNameValue?[i] as? String != "name" && specNameValue?[i] as? String != "lastUpdate" && specNameValue?[i] as? String != "message" && specNameValue?[i] as? String != "adminMessage" && specNameValue?[i] as? String != "photoURL" {

user.status = ""

}

i += 1

}


}) { (error) in

print(error.localizedDescription)

}

self.tableArray.append(user)

self.tableView.reloadData()

}

最佳答案

您的应用崩溃的主要原因是因为在您的行单元格中,您在加载第一个用户后重新加载,并且该单元格期望 statusArray 已经包含元素。

cell.nameCell.text = tableArray[indexPath.row]
cell.statusCell.text = statusArray[indexPath.row] // fails here I assume

这里出现了一些问题,我将尝试解决。

  • 您将立即为迭代的每个子项重新加载表。明智的做法是向每个数组追加元素,然后在完成后通过调用 tableView.reloadData()
  • 显示所有元素
  • “状态”与您期望的名称无关吗?如果数据是相关的,那么明智的做法是创建一个简单的对象来容纳这些数据,并拥有一个 tableView 将用作其数据源的数据数组
  • 数据完全加载后,您可以对数据进行相应排序,然后重新加载数据源,以解决从服务器拉取数据的问题。这就是为什么 append(element: ) 简单而有用

希望这有帮助!这可能看起来需要更多工作,但它肯定会对您自己的性能、组织和可读性有益。

关于ios - Firebase 客户端应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43526802/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com