Ios 比较不同的行,并在tableview-Firebase/Swift 3中创建一行

Ios 比较不同的行,并在tableview-Firebase/Swift 3中创建一行,ios,swift,firebase-realtime-database,Ios,Swift,Firebase Realtime Database,我是Swift 3和Firebase编程的新手,但我正在取得良好的进展。但有时事情会变得更难,我又来了,因为我找不到一些我需要的特别文本,也没有为Swift 3更新。我试过很多方法 问题是,我正在为一些老师开发一个应用程序,让他们与学生一起进行一种考试。每个学生在不同的时间由两位不同的老师进行相同的考试,结果显示在表格视图控制器上,如下图所示: 正如你所看到的,我为每个学生画了两行,每个学生有两个不同的分数(部分)。我希望过滤Firebase数据,搜索这两个“重复”的学生,并从他们身上获得平均

我是Swift 3和Firebase编程的新手,但我正在取得良好的进展。但有时事情会变得更难,我又来了,因为我找不到一些我需要的特别文本,也没有为Swift 3更新。我试过很多方法

问题是,我正在为一些老师开发一个应用程序,让他们与学生一起进行一种考试。每个学生在不同的时间由两位不同的老师进行相同的考试,结果显示在表格视图控制器上,如下图所示:

正如你所看到的,我为每个学生画了两行,每个学生有两个不同的分数(部分)。我希望过滤Firebase数据,搜索这两个“重复”的学生,并从他们身上获得平均分数,然后在表视图控制器(exam1+exam2/2)上显示数据以获得最终平均分数。这是我目前的Firebase结构(稍后我会在这个问题上发布一个替代方案):

现在,部分代码: 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,
        ]
    }

}
主表视图控制器的加载方法

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,表视图为空:

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

func Load_HM1() {
        let refW = FIRDatabase.database().reference().child("semestre_1_2017").child("avaliacaoHM12017").child("cheklists") ... I CRASHED HERE..
//此方法的其余部分与前面显示的相同


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

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

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

此外,您应该查看和。应用这些指导原则将有助于在数据增长的同时扁平化数据并提高性能

编辑:

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

func Load_HM1(){
设refW=FIRDatabase.database().reference().child(“semestre_1_2017”).child(“avalicaohm12017”).child(“cheklists”)
refW.queryOrdered(byChild:“nome”).observe(.value,其中:{(快照)位于
var newTeste2:[检查]=[]
var检查:[检查]=[]
变量位置=-1
对于snapshot.children中的resposta{
let itemsadicionar=检查(快照:resposta as!FIRDataSnapshot)
newtest2.append(itemsadiciator)

对于0中的考试..好的,谢谢@alex,但是如何“提取相应的考试对”和“存储数组”有了这些新的解决方案?你能在这里帮忙吗?嗨@alex,谢谢你的帮助。我理解你的想法,我正在努力让它发挥作用。这个解决方案也帮助我解决了其他问题。但特别是在这里,它会在下面两行返回一个快速编译错误:
if(position!=-1)
。这是消息:“无法为inout[examing]'(akaínout数组')类型的值下标”。我不知道这可能是什么。如果你有任何想法,那就太好了。无论如何,再次感谢。嗨@Ivansiniglia,我刚刚又看了一眼你对考试的定义。你将nota存储为一个字符串,尽管我假设它是一个浮点值。因此你需要将你的值转换为一个数字,执行必要的计算并将其存储为一个字符串一串
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
 })
}