gpt4 book ai didi

ios - 比较不同的行并在表格 View 中将它们合并为一 - Firebase/Swift 3

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

我是 Swift 3 和 Firebase 编程新手,但我取得了良好的进步。但有时事情会变得更困难,我又在这里,因为我找不到我需要的具体文本,也没有针对 Swift 3 进行更新。我尝试了很多方法。

问题是我正在为一些老师构建一个应用程序,以便与学生进行某种考试。每个学生在不同时间由两位不同的老师进行相同的考试,结果显示在表格 View Controller 中,如下图所示:

Main tableview

如您所见,每个学生有两行有两个不同的分数(部分)。我希望过滤此 Firebase 数据,搜索这两个“重复”学生并计算他们的平均分数,并在 TableView Controller (exam1 + exam2/2)中显示数据以获得最终平均分数。这是我当前的 Firebase 结构(我稍后会在这个问题上发布替代方案):

Firebase currently structure

现在,部分代码:1. 变量和快照的结构体

import Foundation
import Firebase

struct Examination {

var nome: String?
var preceptor: String?
var dataHoje: String?
var nota: String?
var key: String?

init(nome: String, preceptor: String, nota: String, dataHoje: String, key: String) {
self.nome = nome
self.preceptor = preceptor
self.nota = nota
self.dataHoje = dataHoje
self.key = key
}

init(snapshot: FIRDataSnapshot) {
key = snapshot.key
let snapshotValue = snapshot.value as? [String: AnyObject]
nome = snapshotValue?["nome"] as? String
preceptor = snapshotValue?["preceptor"] as? String
nota = snapshotValue?["nota"] as? String
dataHoje = snapshotValue?["dataHoje"] as? String
notaAtitude = snapshotValue?["notaAtitude"] as? String

}

func toAnyObject() -> Any {
return [
"nome": nome,
"preceptor": preceptor,
"nota": nota,
"dataHoje": dataHoje,
"userKey": key,
]
}

}

主 TableView Controller 的加载方法

import Foundation
import Firebase
var refAlunos: [Examination] = []

override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(true)
Load_HM1()
}

func Load_HM1() {
let refW = FIRDatabase.database().reference().child("semestre_1_2017").child("avaliacaoHM12017").child("cheklists")
refW.queryOrdered(byChild: "nome").observe(.value, with: {(snapshot) in

var newTeste2: [Examination] = []
for resposta in snapshot.children {
let itemsAadicionar = Examination(snapshot: resposta as! FIRDataSnapshot)
newTeste2.append(itemsAadicionar)
}
self.refAlunos = newTeste2
})
}

最后,我也尝试过 Firebase 结构,但结果总是收到 nil, TableView 为空:

Optional structure

这种替代方式(方法加载)的代码,我无法实现:

func Load_HM1() {
let refW = FIRDatabase.database().reference().child("semestre_1_2017").child("avaliacaoHM12017").child("cheklists") ... I CRASHED HERE..

//该方法的其余部分与之前显示的相同

因此,回到这个问题,我需要一种方法来比较具有相同学生姓名的行(始终为 2)并计算这两个分数的平均值,并发布一个包含最终分数和名称的表格 View ,几乎与第一张图像,但仅将分数更改为最终平均值。我真的不知道有没有路,也不知道该走哪条路。我搜索了很多,但一无所获。我想第二个 firebase 结构可能更友好,但我的行是空的。如果需要更多信息来理解这个问题,请让我更新问题。非常感谢您的帮助。

最佳答案

我不知道 Firebase 提供此类开箱即用的功能,因此我建议您手动进行计算。

在回调函数末尾设置 self.refAlunos 之前,您可以提取相应的考试对,计算每对考试的平均成绩,并创建一个包含计算出的平均成绩和剩余属性。然后,您可以将生成的检查数组存储在 self.refAlunos 中。

此外,您应该看看 Structure Your DatabaseStructuring your firebase data 。应用这些准则将有助于扁平化您的数据并随着数据的增长提高性能。

编辑:

我目前不在 Mac 上,但我希望我的建议能够为您指明正确的方向,尽管它们在语法上可能不是 100% 正确。

func Load_HM1() {
let refW = FIRDatabase.database().reference().child("semestre_1_2017").child("avaliacaoHM12017").child("cheklists")
refW.queryOrdered(byChild: "nome").observe(.value, with: {(snapshot) in

var newTeste2: [Examination] = []

var examinations: [Examination] = []
var position = -1

for resposta in snapshot.children {
let itemsAadicionar = Examination(snapshot: resposta as! FIRDataSnapshot)
newTeste2.append(itemsAadicionar)
for exam in 0..<examinations.count {
if (examinations[exam].nome == itemsAadicionar.nome) {
position = exam
break
}
}
if (position != -1) {
examinations[position].nota += itemsAadicionar.nota
examinations[position].nota /= 2
position = -1
}
}
self.refAlunos = examinations
})
}

我已经编辑了您的代码,希望您能明白要点。然而,这种方法仅适用于每个学生总是有两次考试的情况。如果你有更多,你需要稍微调整一下。

关于ios - 比较不同的行并在表格 View 中将它们合并为一 - Firebase/Swift 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41721403/

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