Кастинг от DataSnapshot до [String: AnyObject] [дубликат]

'data' должен быть строгим JavaScript-объектом:

data: JSON.stringify({ "userName": userName, "password" : password })

Чтобы отправить ваш formData, перейдите к stringify:

data: JSON.stringify(formData)

Некоторые серверы также требуется тип содержимого application/json:

contentType: 'application/json'

Также есть более подробный ответ на аналогичный вопрос: Jquery Ajax Проводка json в webservice

31
задан PRONKERIJ 3 February 2018 в 11:55
поделиться

5 ответов

Если я правильно прочитал документацию , это то, что вы хотите:

var ref = Firebase(url: MY_FIREBASE_URL)
ref.observeSingleEvent(of: .value) { snapshot in
    print(snapshot.childrenCount) // I got the expected number of items
    for rest in snapshot.children.allObjects as! [FIRDataSnapshot] {
       print(rest.value)     
    }
}

Лучшим способом может быть:

var ref = Firebase(url: MY_FIREBASE_URL)
ref.observeSingleEvent(of: .value) { snapshot in
    print(snapshot.childrenCount) // I got the expected number of items
    let enumerator = snapshot.children
    while let rest = enumerator.nextObject() as? FIRDataSnapshot {
       print(rest.value)     
    }
}

Первый метод требует, чтобы NSEnumerator возвращал массив всех объектов, которые затем могут быть перечислены обычным способом. Второй метод получает объекты по одному из NSEnumerator и, скорее всего, более эффективен.

В любом случае объекты, которые перечислены, являются объектами FIRDataSnapshot, поэтому вам нужны броски, чтобы вы может получить доступ к свойству value.


Использование цикла for-in:

Начиная с написания исходного ответа в Swift 1.2 дня, язык развился. Теперь можно использовать цикл for in, который напрямую работает с счетчиками вместе с case let для назначения типа:

var ref = Firebase(url: MY_FIREBASE_URL)
ref.observeSingleEvent(of: .value) { snapshot in
    print(snapshot.childrenCount) // I got the expected number of items
    for case let rest as FIRDataSnapshot in snapshot.children {
       print(rest.value)     
    }
}
77
ответ дан vacawama 16 August 2018 в 04:34
поделиться

Я только что преобразовал вышеприведенный ответ в Swift 3:

ref = FIRDatabase.database().reference()    
ref.observeSingleEvent(of: .value, with: { snapshot in
       print(snapshot.childrenCount) // I got the expected number of items
       for rest in snapshot.children.allObjects as! [FIRDataSnapshot] {
           print(rest.value)
           }
})

. Лучший способ может быть:

    ref = FIRDatabase.database().reference() 
    ref.observeSingleEvent(of: .value, with: { snapshot in
            print(snapshot.childrenCount) // I got the expected number of items
            let enumerator = snapshot.children
            while let rest = enumerator.nextObject() as? FIRDataSnapshot {
                print(rest.value)
            }
        })
17
ответ дан Cesare 16 August 2018 в 04:34
поделиться
  • 1
    Спасибо, но работает, но print(rest.value) печатает Optional(0), вместо этого он должен печатать интергель. Как я могу сделать print(rest.value) для печати целого числа? – Parag Kadam 5 March 2017 в 14:42
  • 2
    @ParagKadam Я проверю и дам вам знать ... – Ketan P 6 March 2017 в 11:15

Это довольно читаемо и отлично работает:

var ref = Firebase(url:MY_FIREBASE_URL)
ref.childByAppendingPath("some-child").observeSingleEventOfType(
  FEventType.Value, withBlock: { (snapshot) -> Void in

      for child in snapshot.children {

        let childSnapshot = snapshot.childSnapshotForPath(child.key)
        let someValue = childSnapshot.value["key"] as! String
      }
})
15
ответ дан Cœur 16 August 2018 в 04:34
поделиться
  • 1
    и если я хочу удалить someValue из базы данных firebase именно этим ключом, что я делаю? – Kika_Fortez 17 August 2016 в 12:10
  • 2
    для SDK v2, есть ли у нас все равно, чтобы сделать обещание обратного вызова в цикле, убедитесь, что мы сделали все вещи, прежде чем делать другие вещи – atom2ueki 5 September 2016 в 10:01
  • 3
    Нет причин для вызова childSnapshotForPath, каждый из которых уже является дочерним снимком. – phatmann 7 February 2018 в 21:11
   ref = FIRDatabase.database().reference().child("exampleUsernames")    
   ref.observeSingleEvent(of: .value, with: { snapshot in

       for rest in snapshot.children.allObjects as! [FIRDataSnapshot] {

           guard let restDict = rest.value as? [String: Any] else { continue }
           let username = restDict["username"] as? String
       }
   })
6
ответ дан Edward 16 August 2018 в 04:34
поделиться

Firebase 4.0.1

       Database.database().reference().child("key").observe(.value) { snapshot in
            if let datas = snapshot.children.allObjects as? [DataSnapshot] {
                let results = datas.flatMap({
                  ($0.value as! [String: Any])["xxx"]
                }
                print(results)
            }
       }

Если у вас несколько ключей / значений и вы хотите return array с dictionary элементами, объявите массив:

var yourArray = [[String: Any]]()

, затем смените тело блока на это:

     let children = snapshot.children
     while let rest = children.nextObject() as? DataSnapshot, let value = rest.value {
          self.yourArray.append(value as! [String: Any])
      }
2
ответ дан William Hu 16 August 2018 в 04:34
поделиться