检索数据:Firebase和Swift 3问题

时间:2016-12-31 13:06:40

标签: firebase swift3 firebase-realtime-database

早上好。我一直在为我的一群教师朋友构建一个应用程序,但我是Swift 3编程的新手,在Firebase中甚至更多,但我正在努力学习很多东西。我之前在网上做了大量的研究,但大多数都已过时或没有具体关于这个问题。所以我希望有人可以帮助我。我在Firebase上有一些数据,我可以按照我想要的方式在表格视图控制器中显示它们。当我想要查看关于一行的更多细节时 - 我有一些关于学生验证的信息(每个学生的每一行) - 我点击那个单元格,我有一个带有这些细节的新视图控制器(详细视图控制器)。我无法检索的是该学生的照片(图片网址),该图片已正确存储在Firebase中,但位于另一个节点中:

---root    
   ---2017FirstSemester
       --validationA
          -- key: -Kwteywgwueyuye
            -- name: Paul Newman
            -- note: 9,0
            -- date: 12/12/2016
            -- teacher: Anne
          -- key: -Kwieiwe86he
            -- name: Barbara Eden
            -- note: 7,9
            -- date: 12/12/2016
            -- teacher: Mark
          -- (…)
        -- (…)
   -- Students
          -- key: -KweewojPaulNewman            
            -- name: Paul Newman
            -- imageURL:  “https://firebasestorage.googleapis.com/…”
        (UPDATED)

这是代码的一部分:

import Foundation
import Firebase

/// UPDATED SOLUTUON    
var ImagemURL_G: String?

struct Students {

    var name: String?
    var imageURL: String?
    var key: String!


    init(name: String, key: String = "", imageURL: String) {
        self.name = name
        self.imageURL  = imageURL
        self.key = key
    }

    init(snapshot: FIRDataSnapshot) {
        key = snapshot.key
        let snapshotValue = snapshot.value as! [String: AnyObject]
        name = snapshotValue["name"] as? String
        imageURL = snapshotValue["imageURL"] as? String

        /// UPDATED SOLUTUON    
        ImagemURL_G: = imagemURL

    }

    func toAnyObject() -> Any {
        return [
            "name": name,
            "userKey": key,
            "imageURL": imageURL
        ]
    }
}

详情视图控制器:

import Foundation
import UIKit
import Firebase

class DetailStudent: UIViewController {

    var DescFB: Students!


@IBOutlet weak var imgPhoto: UIImageView!
@IBOutlet weak var labelStudentName: UILabel!
@IBOutlet weak var labelTeacher: UILabel!
@IBOutlet weak var labelNote: UILabel!
@IBOutlet weak var labelDate: UILabel!

    override func viewDidLoad() {
    super.viewDidLoad()

    labelStudentName.text = DescFB.name
    labelTeacher.text = DescFB.teacher
    labelNote.text = DescFB.note
    labelDate.text = DescFB.date

    LoadStudent()

    }

func LoadStudent() {

let nameIns = labelStudentName.text
let ref = FIRDatabase.database().reference().child("2017FirstSemester ").child(“validationA”)

    let db = ref.queryOrdered(byChild: "name").queryEqual(toValue: nomeIns)
        db.observe(.value, with: { (snapshot) in
            for snap in snapshot.children {

          print("userKey: \((snap as! FIRDataSnapshot).key)")
          self.labelKeyResult.text = (snap as! FIRDataSnapshot).key
          print("PRINT SNAP: \(snap)")
            }
        })
}

当详细信息视图控制器加载时,它会加载验证的所有值,并尝试使用学生名称(通过segue)来引用一种新方法,以便从“学生”节点中获取学生的信息(其中存储信息名称和图像照片以在其他视图控制器中用于其他验证或其他目的),但我可以检索“关键”信息以在标签对象中显示它。 “Name”和“imageURL”我可以找到一种方法来查看它们在调试器窗口中打印,如下所示:

userKey: -K_GiQwPXfR3AMvxyBat

PRINT SNAP: Snap (-K_GiQwPXfR3AMvxyBat) {
    imageURL = "https://firebasestorage.googleapis.com/v0/b/chklist-5f5d3.appspot.com/o/https:%2Fchklist-...b36b3";
    name = "PAUL NEWMAN";
    userKey = "-K_GiQwPXfR3AMvxyBat";
}

我需要" imageURL"在图像视图对象中显示这些照片并检索此字符串是我不知道如何做到的:

var url = DescFB.imageURL
let url2 = NSURL(string: (url)!)
let data = NSData(contentsOf: (url2 as? URL)!)
imgPhoto.image = UIImage(data: data as! Data) 

内部" func LoadStudent"我尝试了很多不同的方式和代码而没有尝试。我认为它非常接近正确的解决方案,但我看不到它。我希望有人能找到并帮助我。非常感谢和2017年快乐。

///更新:解决方案的一部分

func LoadStudent() {

        let nomeIns = labelStudentName.text
        var newTeste: [Students] = []
        let db = refImagem.queryOrdered(byChild: "name").queryEqual(toValue: nomeIns)
        db.observe(.value, with: { (snapshot) in

            for resposta in snapshot.children {
                let itemsAadicionar = Students(snapshot: resposta as! FIRDataSnapshot)
                newTeste.append(itemsAadicionar)
            }

            self.AlunosAvaliados = newTeste

            // It's here where the url receive URL string captured before
            var url = ImagemURL_G
            if url != nil{
                let url2 = NSURL(string: (url)!)
                let data = NSData(contentsOf: (url2 as? URL)!)
                if data != nil {
                    self.imgPhoto.image = UIImage(data: data as! Data) }
            }else{
                url = "https://firebasestorage.googleapis.com/v0/b/chklist-5f5d3.appspot.com/o/imagesAlunos%2Fpessoa2.png?alt=media&token=e4b47dca-9dd0-444e-81d5-cf4cf122b94a"
                let url2 = NSURL(string: (url)!)
                let data = NSData(contentsOf: (url2 as? URL)!)
                self.imgPhoto.image = UIImage(data: data as! Data)
            }

        })

    }

1 个答案:

答案 0 :(得分:0)

我不知道这是不是最好的方法,但我找到了一种方法

1)我已经定义了一个全局变量来捕获任何视图控制器的URL字符串:var ImagemURL_G: String?

2)在struct“Students”中,我已将此变量设置为捕获快照正下方的字符串:ImagemURL_G = imageURL。 ImageURL是数组的组件之一,所以我尝试在这里捕获字符串,在数组只有一个学生填充后,我在LoadStudent方法中定义了:queryEqual(toValue: nomeIns)

3)我重写了LoadStudent方法,使用在struct“Students”中捕获的字符串,并将NSData转换回UIImage。

有效。如果有人能够以更好,更简单的方式做,我很高兴看到它在这里发布。我想这不是最好的方式,但是根据我在Swift 3和Firebase中的经验水平,这将是最好的方式。