Результат вызова 'functionName ()' не используется - PullRequest
0 голосов
/ 02 октября 2019

У меня странная проблема, и я не уверен, что делаю неправильно.

У меня есть следующая функция, которую я хочу вызвать в viewDidLoad, чтобы загрузить все документы в коллекции, которая будет использоваться вtableview.

func functionName() -> [String] {

    var NameArray = [String]()

    db.collection("Names").getDocuments() { (querySnapshot, err) in
        if let err = err {
            print("Error getting documents: \(err)")
        } else {
            for document in querySnapshot!.documents {
                NameArray.append("\(document.documentID)")
            }
        }
    }
    print(NameArray)
    print(NameArray.count)

    return (NameArray)
}

Функция имеет предупреждение результат игнорируется . Я не хочу молчать, поскольку мне нужно значение, оно должно возвращать массив со значениями и ненулевым счетчиком.

Я запускаю приведенный ниже код, связанный с кнопкой, и он возвращает массив и счеткак и ожидалось. Я также хотел бы сохранить переменную NameArray как локальную.

@IBAction func fetchUsersButton(_ sender: UIButton) {
    var NameArray = [String]()

    db.collection("Names").getDocuments() { (querySnapshot, err) in
        if let err = err {
            print("Error getting documents: \(err)")
        } else {
            for document in querySnapshot!.documents {
                NameArray.append("\(document.documentID)")
            }
        }
        print(NameArray)
        print(NameArray.count)
    }
}

Ответы [ 3 ]

5 голосов
/ 02 октября 2019

Вместо того, чтобы возвращать массив, вам нужно поместить его в обработчик завершения.

func functionName(_ completion: @escaping ([String]) -> Void) {

    var NameArray = [String]()

    db.collection("Names").getDocuments() { (querySnapshot, err) in
        if let err = err {
            print("Error getting documents: \(err)")
        } else {
            for document in querySnapshot!.documents {
                NameArray.append("\(document.documentID)")
            }
        }

        completion(NameArray)
    }        
}
1 голос
/ 02 октября 2019

Вы можете попробовать что-то вроде этого:

func functionName() -> [String] {

    var nameArray = [String]()

    db.collection("Names").getDocuments() { (querySnapshot, err) in
        if let err = err {
            print("Error getting documents: \(err)")
        } else {
            for document in querySnapshot!.documents {
                NameArray.append("\(document.documentID)")
            }
            print(nameArray)
            return nameArray
        }
    }
    print(nameArray)
    print(nameArray.count)

    return (nameArray)
}

Если ваш код попадает в оператор else, потому что проблем не было, и вы смогли получить данные;вот когда вам нужно вернуть массив после того, как вы просматриваете каждый документ. Поскольку эта функция firebase использует обработчик завершения, поэтому, если вы помещаете операторы печати вне завершения, она выполняется автоматически. Также вы не должны начинать переменные с заглавной буквы. В Swift рекомендуется использовать camelCase. Надеюсь, это поможет.

0 голосов
/ 02 октября 2019

Причина, по которой вы ничего не возвращаете, заключается в том, что db.collection().getDocuments является асинхронной функцией . Это означает, что функция выполняет «возврат» до выполнения кода db.collection().getDocuments.

«Возврат» предполагает, что код будет выполняться синхронно , что означает выполнение строкипо линии в предсказуемом порядке. асинхронная функция - это функция, в которой мы не знаем, когда она завершит выполнение (что всегда верно для сетевого кода).

Что если сеть не работает? Что делать, если загрузка занимает много времени? Поскольку мы не можем знать, мы используем обработчик завершения , чтобы «вернуть» то, что нам нужно после завершения функции. Другие предложения хороши, ниже другое решение. В качестве примечания предполагается, что эта функция является частью класса, и вы хотите присвоить результат внешней переменной.

class MyClass {

      var myNameArray = [String]()

      func functionName() {

          db.collection("Names").getDocuments() { (querySnapshot, err) in
              if let err = err {
                  print("Error getting documents: \(err)")
              } else {
                  for document in querySnapshot!.documents {
                      myNameArray.append("\(document.documentID)")
                  }
              }
          }
      }

}

Еще одна небольшая вещь в соглашениях об именах: переменные должны использовать camelCase, поэтому nameArray предпочтительнее NameArray.

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