Хранение данных из Firestore в список - PullRequest
1 голос
/ 03 апреля 2020

У меня есть база данных, в которой хранятся серии целочисленных значений, которые ежедневно вводятся пользователем и хранятся в виде списка целых чисел. У меня есть следующий код, который запрашивает базу данных и сохраняет искомое значение симптома в список, который затем возвращается из функции, в то время как при выполнении для l oop ReturnData, похоже, содержит все значения из базы данных, однако, когда Я помещаю print(returnedData) сразу после запроса и перед оператором return он печатает пустой список. Я не совсем уверен, почему for l oop неправильно добавляется в список возвращенных данных.

func yearDataReturn(year: Int,symptom: String)->[Int]{
    //fetches all the year for the month and returns it as a list
    let collectionRef = db.collection("entries")
    var returnedData:[Int] = []
    collectionRef.whereField("year", isEqualTo: year).whereField("UserID", isEqualTo: UserDefaults.standard.integer(forKey: "UserID")).order(by: "monthOfYear").order(by: "weekOfMonth").order(by: "dayOfMonth")
        .getDocuments{(QuerySnapshot,err)in
            for doc in QuerySnapshot!.documents{
                let sympLis=doc.get("SymptomValues") as! [Int]

                let symp=sympLis[self.symptoms.firstIndex(of: symptom)!]
                returnedData.append(symp)
            }

    }
    return returnedData

}

1 Ответ

0 голосов
/ 03 апреля 2020

Сначала добро пожаловать на сайт.


Это асинхронный вызов c, который означает, что блок строки запроса (collectionRef.whereField(...) будет выполняться после строки return returnedData.

Пожалуйста, проверьте эту среднюю статью -> Управление асинхронным c кодом в Swift


Вы можете сделать это с передачей closure в вашу функцию, например это ->

func yearDataReturn(year: Int,symptom: String, completion: @escaping ([Int] -> Void)) {
  //fetches all the year for the month and returns it as a list
  let collectionRef = db.collection("entries")
  var returnedData:[Int] = []

  collectionRef.whereField("year", isEqualTo: year).whereField("UserID", isEqualTo: UserDefaults.standard.integer(forKey: "UserID")).order(by: "monthOfYear").order(by: "weekOfMonth").order(by: "dayOfMonth")
    .getDocuments{(QuerySnapshot,err)in
      for doc in QuerySnapshot!.documents{
        let sympLis=doc.get("SymptomValues") as! [Int]

        let symp=sympLis[self.symptoms.firstIndex(of: symptom)!]
        returnedData.append(symp)
      }
      completion(returnedData)
  }
}

Использование


yearDataReturn(year: 5, symptom: "asdf") { symptomValues in
  print(symptomValues)
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...