arrays - 通过函数传递全局数组在 swift 中不起作用

标签 arrays swift firebase google-cloud-firestore

我有这个程序,它从 firestore 获取值并将它们放入数组中。我已经通过使用测试打印函数确认这些数组内部有数据。当我声明 2 个全局数组( gloabalGPA 和 globalSAT)并通过函数将 gpaColleges 和 satColleges 的值传递给它们时,一切正常。我将测试打印函数放置在函数内部(swithcSATArray 和 switchGPAArray)。 但是,当我尝试在不同的函数中再次打印这些全局变量时,打印函数会打印出一个空数组。像这样:([])

import UIKit
import FirebaseAuth
import FirebaseDatabase
import Firebase
import FirebaseFirestore

class ScoresViewController: UIViewController {

var docRef: DocumentReference!
let defaultStore = Firestore.firestore()
var globalGPA = [String]()
var globalSAT = [String]()

override func viewDidLoad() {
    super.viewDidLoad()
    let userID: String = (Auth.auth().currentUser?.uid)!
    docRef = Firestore.firestore().document("Users/\(userID)")
    // Do any additional setup after loading the view.
}

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

@IBOutlet weak var GpaScore: UITextField!

@IBOutlet weak var SATscore: UITextField!

@IBOutlet weak var ACT_Score: UITextField!

@IBAction func SubmitTapped(_ sender: Any) {
    print("Submit Tapped")
    let Sattext = SATscore.text
    let Acttext = ACT_Score.text
    let Gpatext = GpaScore.text
    let gpaScore = Gpatext
    let SatScore2 = Sattext
    let Acttext2 = Acttext
    let CombinedScores = Sattext! + Acttext!
    if GpaScore.text == "" {
        self.createAlert(titleText: "Error", messageText: "No Weighted GPA Entered")
    }
    else if CombinedScores == "" {
        self.createAlert(titleText: "Error", messageText: "No SAT nor ACT Score Entered")
    }
    else{
        let dataToSave: [String: Any] = ["GPA": gpaScore!, "SAT Score": SatScore2!, "ACT Score": Acttext2!]
        docRef.setData(dataToSave) { (error) in
            if let error = error {
                print("error in sending data to fireStore: \(error.localizedDescription)")
            }else {
                print("Data was succesfully saved to FireStore")
            }
        }
        self.presentLoggedInScreen()
        sendToFireStore(gpa: gpaScore!, sat: SatScore2!)
         self.addArrays()
    }
}

func createAlert (titleText : String , messageText: String) {

    let alert = UIAlertController (title: titleText, message: messageText, preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "Dissmis", style: .default, handler: { (action) in alert.dismiss(animated: true, completion: nil)

    }))

    self.present(alert, animated: true, completion: nil)
}

func presentLoggedInScreen() {
    let storyboard:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let HomeVC:HomeVC = storyboard.instantiateViewController(withIdentifier: "HomeVC") as! HomeVC
    self.present(HomeVC, animated: true, completion: nil)

}

func sendToFireStore(gpa: String, sat: String) {
    let db = Firestore.firestore()
    var gpaColleges = [String]()

    let gpaRef = db.collection("Colleges")
    let query1 = gpaRef
        .whereField("Average GPA", isLessThanOrEqualTo: gpa)
        .getDocuments() { (querySnapshot, err) in
            if let err = err {
                print("Error getting documents: \(err)")
            } else {
                for document in querySnapshot!.documents {

                    gpaColleges.append(document.documentID)

                }
                self.switchGPAArray(gpa: gpaColleges)
            }
    }
    var satColleges = [String]()
    let satRef = db.collection("Colleges")
    let query2 = satRef
        .whereField("Average SAT Score", isLessThanOrEqualTo: sat)
        .getDocuments() { (querySnapshot, err) in
            if let err = err {
                print("Error getting documents: \(err)")
            } else {
                for document in querySnapshot!.documents {
                    satColleges.append(document.documentID)
                }
                self.swithcSATArray(sat: satColleges)
            }

    }

}


func swithcSATArray(sat: Array<Any>) {
   self.globalSAT = sat as! [String]
    print("Printing inside of SAT function \(self.globalSAT)")


}

func switchGPAArray(gpa: Array<Any>) {
    self.globalGPA = gpa as! [String]
 print("Printing inside of GPA funtion  \(self.globalGPA)")
}

func addArrays() {
    print("INSIDE OF ADD ARRAYS SAT \(self.globalSAT)")
    print("INSIDE OF ADD ARRAYS GPA \(self.globalSAT)")
}

}

任何帮助将不胜感激。

最佳答案

首先,有很多代码,但关于您的问题的信息很少。我们甚至不知道您首先调用哪个函数以及第二个打印空的函数是什么?

您提供更多详细信息后,我可以编辑此答案。但据我所知,你有闭包,编译器不会等待闭包完成,运行下一行。如果这是问题所在,您可以使用线程并在主线程中运行代码,这样您就可以确保它已完成。或者您可以使用委托(delegate)模式在完成时收到通知。

或者只是这样做:

let dataToSave: [String: Any] = ["GPA": gpaScore!, "SAT Score": SatScore2!, "ACT Score": Acttext2!]
    docRef.setData(dataToSave) { (error) in
        if let error = error {
            print("error in sending data to fireStore: \(error.localizedDescription)")
        }else {
            self.presentLoggedInScreen()
            sendToFireStore(gpa: gpaScore!, sat: SatScore2!)
            self.addArrays()
            print("Data was succesfully saved to FireStore")
        }
    }

如果上述方法均无效,请提供有关您的问题的更多详细信息! :)

关于arrays - 通过函数传递全局数组在 swift 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47123400/

相关文章:

android - Flutterfire 配置无法以任何可能的方式工作

c - 初始化结构数组奇怪的行为

php - 翻转多维数组的更好方法?

android - 从 Firebase 检索数据以创建要在数据库中编辑的地址

swift - 如何快速获取 NsKeyValueObservationinfo?

swift - 扩展元素类型为通用的集合 (Swift)

android - Firebase MLKit 条码扫描器 : Adding supported formats

javascript - 如何删除引号或将此字符串作为普通数组传递

arrays - 将字符串分配给数组而不是在 bash 脚本中使用读取?

swift - 在 Swift 中确定集合类型