Firebase не завершает работу перед вызовом следующего метода - PullRequest
0 голосов
/ 26 апреля 2019

Я звоню в базу данных firebase со следующими данными:

    let myRef1 = Database.database().reference(withPath: "/tests/\ . 
     (myTest)")
    print(myTest)
    myRef1.observe(.value, with: {
        snapshot in
        print(snapshot)
        var newItems: [qItem] = []
        for item in snapshot.children {
            let mItem = qItem(snapshot: item as! DataSnapshot)
            newItems.append(mItem)
            print(newItems)
        }
        self.myArray = newItems.shuffled()
        print(self.myArray)
    })

    loadNext()
    ...

Однако он никогда не завершает обработчик завершения до перехода к следующему вызову метода, который зависит от результатов этого.

Попытка сделать это отдельным методом и т. Д., Но, похоже, ничего не работает.

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Вам нужно добавить метод loadNext() внутри observe, чтобы иметь возможность вызывать его после извлечения данных.Когда вы извлекаете данные, это происходит асинхронно, что означает, что компилятор не будет ждать, пока все данные будут извлечены, сначала он вызовет метод loadNext(), а затем, после завершения извлечения данных, выполнит print(newItems), поэтому вам нужно выполнитьследующее:

    myRef1.observe(.value, with: {
    snapshot in
    print(snapshot)
    var newItems: [qItem] = []
    for item in snapshot.children {
        let mItem = qItem(snapshot: item as! DataSnapshot)
        newItems.append(mItem)
        print(newItems)
        loadNext()
    }
    self.myArray = newItems.shuffled()
    print(self.myArray)
})
0 голосов
/ 26 апреля 2019

Данные Firebase обрабатываются асинхронно.Даг Стивенсон написал отличный блог о том, почему это так и что это значит для разработчиков.Я также написал блог , где я показываю, как использовать замыкания в ваших функциях для обработки асинхронных данных.Хотя вы определенно можете вызывать loadNext() изнутри observe замыкания, вы можете обнаружить, что в конечном итоге вы получаете длинную последовательность замыканий внутри одной и той же функции.Я немного подробнее расскажу об этом в сообщении в блоге.В вашем конкретном случае вы можете сделать что-то вроде этого:

func getArray(completion: @escaping ([qtItem]) -> Void) {
  let myRef1 = Database.database().reference(withPath: "/tests/\ . 
     (myTest)")
  print(myTest)
  myRef1.observe(.value, with: {
      snapshot in
      print(snapshot)
      var newItems: [qItem] = []
      for item in snapshot.children {
          let mItem = qItem(snapshot: item as! DataSnapshot)
          newItems.append(mItem)
          print(newItems)
      }
      self.myArray = newItems.shuffled()
      print(self.myArray)
      completion(self.myArray)
  })
}

Затем, когда вы звоните getArray(), вы можете обрабатывать данные изнутри замыкания:

getArray() { newItems in
  // do something with newItems, like pass to `loadNext()` if needed
  self.loadNext()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...