通过函数传递全局数组并不适用于swift

时间:2017-11-05 15:39:07

标签: arrays swift firebase google-cloud-firestore

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

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)")
}

}

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

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

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

或者只是这样做:

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")
        }
    }

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