【问题标题】:Passing global Arrays through functions is not working in swift通过函数传递全局数组不能快速工作
【发布时间】:2017-11-05 15:39:06
【问题描述】:

我有这个程序,它从 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)")
}

}

任何帮助将不胜感激。

【问题讨论】:

  • 在调用addArrays之前,您需要等待async函数sendToFireStore完成基于Firestore的处理。
  • 我该怎么做? @PauloMattos

标签: arrays swift firebase google-cloud-firestore


【解决方案1】:

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

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

或者只是这样做:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    相关资源
    最近更新 更多